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.
- ¿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
}
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?
¿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.
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 deProfiles
? 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.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.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.
fuente
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.En general, creo que sería razonable que los enlaces sean independientes
struct
si 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 queLinks
sin 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
User
clase simple debe tener un código para manejar todos los métodos posibles de entrada y recuperación de datos. Simplemente haga que unaUser
clase retenga y mantenga los datos mientras están en la memoria. Todo lo demás puede ser manejado por clases más apropiadas.fuente