¿Es una buena práctica envolver un conjunto relacionado de propiedades en su propia estructura / clase?

10

Escribir un objeto Usuario en Swift, aunque mi pregunta se refiere a cualquier lenguaje fuertemente tipado. Un usuario puede tener un montón de enlaces (FacebookProfile, InstagramProfile, etc.). Algunas preguntas sobre esto.

  1. ¿Es una buena práctica envolver enlaces en su propio objeto?
    usuario de la estructura {
       var firstName: string
       var lastName: string
       correo electrónico var: cadena
       var links: Enlaces
    }
    Enlaces de estructura {
       var facebook: cadena
       var instagram: string
       var twitter: cadena 
    }

¿O deberían estar sueltos? Sé técnicamente que ambas formas están bien, pero me pregunto si hay un enfoque recomendado, en general, especialmente para la legibilidad.

struct User { 
   var firstName: string
   var lastName: string
   var email: string
   var facebookLink: string
   var twitterLink: string
   var instagramLink: string
}
  1. En un escenario como este, ¿deberían los enlaces ser una colección / lista? Pensé que no debería ser una lista porque hay un número fijo de opciones de enlace disponibles, y no un número creciente. ¿Mi pensamiento es correcto?

  2. ¿Es una buena práctica colocar mis métodos de red dentro del objeto Usuario, como getUsers, getUser, updateUser?

Sé que esto podría ser subjetivo, pero estoy tratando de entender cuál es la mejor práctica en situaciones similares. Agradecería cualquier puntero.

Prabhu
fuente

Respuestas:

30

O bien necesitarás

  • cero de una cosa,
  • uno de una cosa, o
  • Un número arbitrario de la cosa.

Me sorprende que su diseño prediga que la cantidad de enlaces necesarios siempre será tres y que sepa cuáles son sus nombres para siempre.

Lo que estoy predicando se llama la regla de cero uno infinito . Puede que no sea obvio al principio, pero es lo que me dice que su diseño no es tolerante al futuro.

Me sentiría diferente si hubiera algo sobre estos enlaces que fuera especial para ellos. Algo especial que hago diferente al acceder a un enlace de Facebook que no hago para un enlace de Twitter. Eso los haría cosas diferentes. Pero eso no se indica en este código.

Es por eso que no me molesta la cadena de correo electrónico. Sé que se usa de manera diferente a los enlaces.

Entonces, hasta que vea una razón para usar estos enlaces de manera diferente, estoy del lado de una colección de enlaces.

naranja confitada
fuente
44
FacebookProfile, InstagramProfile, ...Creo que OP ya respondió la pregunta. Su lenguaje nos dice que los usuarios pueden tener ninguno o varios perfiles relacionados con redes sociales. Pero el programador dentro de él / ella ha convertido este elemento en simples enlaces. ¿Por qué no una colección de Profiles? Estuve de acuerdo con CandiedOrange. Estás asumiendo demasiado sobre el futuro. Pueden aparecer nuevas redes sociales. Los reales pueden desaparecer. Los usuarios pueden ir y venir de una red a otra.
Laiv
Esto es una conjetura. Supongamos que desea utilizar estos perfiles para inicios de sesión sociales. Teniendo el perfil del componente, tenemos por dónde comenzar. Dónde encapsular información sobre la autenticación y la sesión actual con estos perfiles. Esto podría considerarse YAGNI o ingeniería excesiva, pero no vale la pena pensar en ello, ver si estas características podrían solicitarse o si podrían aportar valor a nuestra aplicación. Si no, simplemente deséchelos.
Laiv
1
@Prabhu depende de por qué lo estás limitando. Mi conjetura es que muchos caben en la GUI. Lo cual está bien. Pero no limite la estructura de datos debido a la GUI. Las GUI cambian por capricho. Las estructuras de datos son costosas de cambiar. Realmente vale la pena hacerlo bien la primera vez.
candied_orange
2
Ese es el punto. Simplemente adopte aquellas estructuras que harán posibles futuros cambios menos dolorosos. Ni mas ni menos. Nosotros, Candied y yo decimos esto porque (creo) nos hemos enfrentado a situaciones similares a menudo y prevemos posibles características susceptibles de cambiar o evolucionar. En última instancia, usted está más cerca del proyecto y su perspectiva de futuro.
Laiv
1
@Prabhu: Tenga en cuenta que hizo una pregunta sobre las buenas prácticas , no si es el enfoque más conciso para su escenario específico. Por lo general, estoy del lado de evitar la ingeniería excesiva, pero el costo de mantenimiento futuro (agregar / eliminar enlaces, actualizar las definiciones de clase de entidad, ...) supera con creces el costo de implementar una colección de enlaces. Si se llama a sus columnas link1, link2, link3, la necesidad de una colección habría sido más evidente. Sin embargo, el hecho de que le haya dado a las columnas un nombre más significativo no cambia el hecho de que es una colección de datos repetitivos.
Flater
6

Estás a punto de caer en la trampa "Veo una posibilidad técnica".

El hecho de que vea un rasgo común entre los elementos no significa que tenga sentido aplicar alguna agregación sobre ellos. La agregación debería significar algo. No a nivel técnico, sino en el dominio de su problema.

Todos son enlaces, pero en el contexto de una clase de usuario, ¿eso significa algo? No. Es tan insignificante como lo sería subgrupo usando clases llamadas "cadenas" y "números".

El problema con este tipo de cosas es que difumina su modelo. Obliga al lector de código a separar lo significativo de lo sin sentido, antes de tener una comprensión completa del dominio.

Nadie habla nunca de los enlaces de un usuario. Sería diferente si llamaras a tu agregación SocialNetworkIds. Debido a que eso realmente significaría algo, sería una verdadera propiedad del Usuario en lugar de una colección técnica arbitraria.

Martin Maat
fuente
Exactamente cuál fue mi duda que me llevó a hacer esta pregunta. La única relación entre los diferentes enlaces es que posiblemente se mostrarían juntos en la interfaz de usuario. Entonces, en este caso, sugeriría NO colocarlos en un objeto separado, sino mantenerlos directamente debajo del objeto Usuario.
Prabhu
1
No creo que sea útil en este caso. Aún no tiene un problema que justifique agregar una capa de complejidad. Si tuviera muchas más propiedades, podría haber una ganancia en un esfuerzo de agrupación (con nombres aptos para los grupos). Sin embargo, es difícil saber qué es apropiado sin contexto. La conclusión es que debería facilitar las cosas. Comprender y / o proceder con el próximo paso en el proceso de desarrollo.
Martin Maat
Yo por lo general como evitar el exceso de ingeniería, pero me pregunto: os lo hubiera dicho lo mismo si OP había nombrado sus campos link1, link2, link3? El diseño de una estructura de datos es independiente del nombre de los campos, por lo que mi ejemplo es funcionalmente equivalente. Es una cuestión de futuro. YAGNI generalmente se aplicaría, pero en todo caso, las redes sociales han demostrado ser susceptibles a la popularidad y los cambios virales. Evitar la reurbanización de cada nuevo sitio popular de redes sociales parece deseable. De lo contrario, corre el riesgo de caer en "¿Qué es un campo más?" trampa, que puede crear una gran deuda.
Flater
1

En general, creo que sería razonable que los enlaces sean independientes structsi es probable que apliques operaciones similares a cada uno de ellos, y particularmente si siempre realizas las mismas operaciones en todos ellos. Si son para fines no relacionados en su solicitud, entonces los haría por separado. Por ejemplo, si fueran la página de inicio del usuario, el sitio web de su proveedor de seguro de salud y un enlace a su sitio de noticias favorito, probablemente no los agruparía, ya que parecen no estar relacionados. Pero para 3 sitios de redes sociales, parece que serán tratados de manera similar en una aplicación, y como tal probablemente deberían agruparse. Usaría un nombre más descriptivo que Linkssin embargo. (¿Qué tipo de enlaces? ¿Con qué propósito en su aplicación?)

Estoy de acuerdo con tu opinión sobre el n. ° 2. Como se mencionó anteriormente, si el número aumentara o se volviera variable, una lista u otra colección sería una buena opción, pero no para el escenario que ha descrito.

No colocaría métodos de red dentro de los objetos que contienen los datos recuperados por la red. De dónde provienen los datos y cómo obtenerlos generalmente son irrelevantes para el propósito principal de una clase. ¿Qué pasa si en el futuro desea obtener algunos datos del disco? ¿O quieres que el usuario lo ingrese? Ir lo suficientemente lejos en ese camino y una Userclase simple debe tener un código para manejar todos los métodos posibles de entrada y recuperación de datos. Simplemente haga que una Userclase retenga y mantenga los datos mientras están en la memoria. Todo lo demás puede ser manejado por clases más apropiadas.

usuario1118321
fuente