Écrire un objet utilisateur dans Swift, bien que ma question concerne n'importe quel langage fortement typé. Un utilisateur peut avoir un tas de liens (FacebookProfile, InstagramProfile, etc.). Quelques questions à ce sujet.
- Est-ce une bonne pratique d'encapsuler des liens dans leur propre objet?
struct Utilisateur { var firstName: chaîne var lastName: chaîne e-mail var: chaîne liens var: Liens }
Liens de struct { var facebook: string var instagram: chaîne var twitter: chaîne }
Ou devraient-ils être lâches? Je sais que techniquement, les deux façons conviennent, mais je me demande s'il existe une approche recommandée, en général - en particulier pour la lisibilité.
struct User {
var firstName: string
var lastName: string
var email: string
var facebookLink: string
var twitterLink: string
var instagramLink: string
}
Dans un scénario comme celui-ci, les liens devraient-ils être une collection / liste? J'ai pensé que cela ne devrait pas être une liste car il existe un nombre fixe d'options de liens disponibles, et non un nombre croissant. Ma pensée est-elle juste?
Est-ce une bonne pratique de placer mes méthodes de mise en réseau à l'intérieur de l'objet User, comme getUsers, getUser, updateUser?
Je sais que cela pourrait être subjectif, mais j'essaie de comprendre quelle est la meilleure pratique dans des situations similaires. J'apprécierais tous les conseils.
FacebookProfile, InstagramProfile, ...
Je pense que OP a déjà répondu à la question. Son langage nous dit que les utilisateurs peuvent ne pas avoir de profils ou plusieurs liés aux réseaux sociaux. Mais le programmeur en lui a transformé cet élément en simples liens. Pourquoi pas une collection deProfiles
? J'étais d'accord avec CandiedOrange. Vous supposez trop sur l'avenir. De nouveaux réseaux sociaux pourraient apparaître. Les vrais pourraient disparaître. Les utilisateurs peuvent aller et venir d'un réseau à un autre.link1
,link2
,link3
, la nécessité d'une collection aurait été plus évidente. Cependant, le fait que vous ayez donné aux colonnes un nom plus significatif ne change pas le fait qu'il s'agit d'une collection de données répétitives.Vous êtes sur le point de tomber dans le piège "Je vois une possibilité technique".
Ce n'est pas parce que vous voyez un trait commun parmi les éléments qu'il est logique de leur appliquer une agrégation. L'agrégation devrait signifier quelque chose. Pas au niveau technique mais dans votre domaine problématique.
Ce sont tous des liens, mais dans le contexte d'une classe d'utilisateurs, cela signifie-t-il quelque chose? Non. Il est tout aussi insignifiant qu'il le serait de sous-groupe à l'aide de classes nommées "chaînes" et "nombres".
Le problème avec ce genre de chose est que cela brouille votre modèle. Il oblige le lecteur de code à séparer le sens du vide de sens, avant d'avoir une compréhension complète du domaine.
Personne ne parle jamais des liens d'un utilisateur. Ce serait différent si vous appeliez votre agrégation SocialNetworkIds. Parce que cela signifierait réellement quelque chose, ce serait une véritable propriété de l'utilisateur plutôt qu'une collection technique arbitraire.
la source
link1
,link2
,link3
? La conception d'une structure de données est indépendante du nom des champs, donc mon exemple est fonctionnellement équivalent. C'est une question de pérennité. YAGNI s'appliquerait généralement, mais si quoi que ce soit, les médias sociaux se sont révélés sensibles à la popularité virale et aux changements. Éviter le réaménagement de chaque nouveau site de médias sociaux populaire semble souhaitable. Sinon, vous risquez de tomber dans le "quel est un domaine de plus?" piège, qui peut créer une dette énorme.En général, je pense qu'il serait raisonnable d'avoir les liens en eux-mêmes
struct
si vous êtes susceptible d'appliquer des opérations similaires à chacun d'eux, et en particulier si vous effectuez toujours les mêmes opérations sur chacun d'eux. S'ils ne sont pas liés à votre demande, je les séparerais. Par exemple, s'il s'agissait de la page d'accueil de l'utilisateur, du site Web de son fournisseur d'assurance maladie et d'un lien vers son site d'actualités préféré, je ne les regrouperais probablement pas car ils ne semblent pas liés. Mais pour 3 sites de médias sociaux, il semble qu'ils seront traités de la même manière dans une application et, en tant que tels, devraient probablement être regroupés. J'utiliserais un nom plus descriptif queLinks
si. (Quel type de liens? Dans quel but dans votre application?)Je suis d'accord avec votre réflexion sur # 2. Comme mentionné ci-dessus, si le nombre devait augmenter ou devenir variable, une liste ou une autre collection serait un bon choix, mais pas pour le scénario que vous avez décrit.
Je ne placerais pas de méthodes de mise en réseau à l'intérieur des objets qui contiennent les données récupérées par le réseau. L'origine des données et la manière de les obtenir ne sont généralement pas pertinentes pour l'objectif principal d'une classe. Que se passe-t-il si à l'avenir vous souhaitez obtenir des données du disque? Ou voulez-vous que l'utilisateur l'entre? Allez assez loin dans cette voie et une
User
classe simple doit avoir du code pour gérer toutes les méthodes possibles de saisie et de récupération des données. Faites simplement tenir uneUser
classe et conservez les données pendant qu'elles sont en mémoire. Tout le reste peut être géré par des classes plus appropriées.la source