Est-ce une bonne pratique d'envelopper un ensemble de propriétés dans sa propre structure / classe?

10

É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.

  1. 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
}
  1. 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?

  2. 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.

Prabhu
la source

Réponses:

30

Vous aurez soit besoin

  • zéro chose,
  • l'un d'une chose, ou
  • un nombre arbitraire de la chose.

Je suis choqué que votre conception prédit que le nombre de liens nécessaires sera toujours de trois et que vous sachiez pour toujours quels sont leurs noms.

Ce que je prêche s'appelle la règle de l'infini zéro un . Ce n'est peut-être pas évident au début, mais c'est ce qui me dit que votre conception n'est pas tolérante à l'avenir.

Je me sentirais différemment s'il y avait quelque chose dans ces liens qui leur était spécial. Une chose spéciale que je fais différemment lorsque j'accède à un lien facebook que je ne fais pas pour un lien twitter. Cela ferait d'eux des choses différentes. Mais cela n'est pas indiqué dans ce code.

C'est pourquoi je ne suis pas gêné par la chaîne de messagerie. Je sais que cela est utilisé d'une manière différente de celle des liens.

Donc, jusqu'à ce que je vois une raison d'utiliser ces liens différemment, je suis du côté d'une collection de liens.

candied_orange
la source
4
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 de Profiles? 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.
Laiv
C'est une conjecture. Supposons que vous souhaitez utiliser ces profils pour les connexions sociales. Ayant le profil de composant, nous avons par où commencer. Où encapsuler les informations concernant l'authentification et la session en cours avec ces profils. Cela peut être considéré comme YAGNI ou une ingénierie excessive, mais cela ne vaut rien d'y penser, voyez si ces fonctionnalités peuvent être demandées ou si elles peuvent apporter une valeur à notre application. Sinon, jetez-les.
Laiv
1
@Prabhu dépend de la raison pour laquelle vous le limitez. Ma supposition est que tant de personnes s'intègrent dans l'interface graphique. Ce qui est bien. Mais ne limitez pas la structure des données à cause de l'interface graphique. Les GUI changent sur un coup de tête. Les structures de données sont coûteuses à modifier. Cela vaut vraiment la peine de les corriger du premier coup.
candied_orange
2
C'est le but. Adoptez simplement les structures qui rendront les changements futurs moins douloureux. Ni plus ni moins. Nous, Candied et moi le disons parce que nous (je crois) avons souvent fait face à des situations similaires et nous prévoyons des caractéristiques susceptibles de changer ou d'évoluer. En fin de compte, vous êtes le plus proche du projet et de ses perspectives d'avenir.
Laiv
1
@Prabhu: notez que vous avez posé une question sur les bonnes pratiques , pas si c'est l'approche la plus concise pour votre scénario spécifique. Je suis généralement du côté d'éviter la suringénierie, mais le coût de la maintenance future (ajout / suppression de liens, mise à jour des définitions de classe d'entité, ...) dépasse de loin le coût de la mise en œuvre d'une collection de liens. Si vous avez appelé vos colonnes 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.
Flater
6

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.

Martin Maat
la source
C'est exactement mon doute qui m'a poussé à poser cette question. La seule relation entre les différents liens est qu'ils pourraient éventuellement être affichés ensemble dans l'interface utilisateur. Donc, dans ce cas, vous suggéreriez de NE PAS les placer dans un droit d'objet séparé, mais plutôt de les garder directement sous l'objet Utilisateur?
Prabhu
1
Je ne pense pas que ce serait utile dans ce cas. Vous n'avez pas encore de problème qui justifie d'ajouter une couche de complexité. Si vous deviez avoir beaucoup plus de propriétés, il pourrait y avoir eu un gain dans un effort de regroupement (avec des noms aptes pour les groupes). Il est cependant difficile de dire ce qui est approprié sans contexte. L'essentiel est que cela devrait faciliter les choses. Pour comprendre et / ou procéder à quelle que soit votre prochaine étape dans le processus de développement.
Martin Maat
En général , je comme éviter sur l' ingénierie, mais je me demande: Auriez - vous dit la même chose si OP avait nommé ses champs 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.
Flater
1

En général, je pense qu'il serait raisonnable d'avoir les liens en eux-mêmes structsi 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 que Linkssi. (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 Userclasse 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 une Userclasse 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.

user1118321
la source