Disons, par exemple, que vous avez une application avec une classe largement partagée appelée User
. Cette classe expose toutes les informations sur l'utilisateur, son identifiant, son nom, les niveaux d'accès à chaque module, le fuseau horaire, etc.
Les données utilisateur sont évidemment largement référencées dans tout le système, mais pour une raison quelconque, le système est configuré de sorte qu'au lieu de passer cet objet utilisateur dans les classes qui en dépendent, nous ne faisons que lui transmettre des propriétés individuelles.
Une classe qui nécessite l'ID utilisateur, nécessitera simplement le GUID en userId
tant que paramètre, parfois nous pourrions également avoir besoin du nom d'utilisateur, de sorte qu'il soit transmis en tant que paramètre distinct. Dans certains cas, cela est transmis à des méthodes individuelles, donc les valeurs ne sont pas du tout conservées au niveau de la classe.
Chaque fois que j'ai besoin d'accéder à une information différente de la classe User, je dois apporter des modifications en ajoutant des paramètres et lorsque l'ajout d'une nouvelle surcharge n'est pas approprié, je dois également modifier chaque référence à la méthode ou au constructeur de classe.
L'utilisateur n'est qu'un exemple. Ceci est largement pratiqué dans notre code.
Ai-je raison de penser qu'il s'agit d'une violation du principe ouvert / fermé? Pas seulement l'acte de changer les classes existantes, mais de les mettre en place en premier lieu afin que des changements généralisés soient très probablement nécessaires à l'avenir?
Si nous venons de passer dans l' User
objet, je pourrais apporter un petit changement à la classe avec laquelle je travaille. Si je dois ajouter un paramètre, je devrai peut-être apporter des dizaines de modifications aux références à la classe.
Y a-t-il d'autres principes brisés par cette pratique? Inversion de dépendance peut-être? Bien que nous ne référençons pas une abstraction, il n'y a qu'un seul type d'utilisateur, il n'est donc pas vraiment nécessaire d'avoir une interface utilisateur.
Y a-t-il d'autres principes non SOLIDES violés, tels que les principes de programmation défensive de base?
Si mon constructeur ressemble à ceci:
MyConstructor(GUID userid, String username)
Ou ca:
MyConstructor(User theUser)
Posté:
Il a été suggéré de répondre à la question sous "ID passe ou objet?". Cela ne répond pas à la question de savoir comment la décision d'aller dans les deux sens affecte une tentative de suivre les principes SOLIDES, qui est au cœur de cette question.
I
dans SOLID
? MyConstructor
dit essentiellement "j'ai besoin d'un Guid
et d'un string
". Alors pourquoi ne pas avoir une interface fournissant a Guid
et a string
, laisser User
implémenter cette interface et laisser MyConstructor
dépendre d'une instance implémentant cette interface? Et si les besoins MyConstructor
changent, changez d'interface. - Cela m'a beaucoup aidé à penser que les interfaces "appartiennent" au consommateur plutôt qu'au fournisseur . Alors pensez "en tant que consommateur, j'ai besoin de quelque chose qui fait ceci et cela" au lieu de "en tant que fournisseur, je peux faire ceci et cela".