Un point de style architectural que j'aimerais aimer votre avis sur s'il vous plaît: p>
Mon ormes m'a donné un objet utilisateur qui correspond à un utilisateur de mon système. Je voulais développer un tas de méthodes de traitement des utilisateurs - getByousername (), authentifier (), VerifyLoginPassword (), etc. Cependant, il me semble que certaines de ces méthodes n'appartiennent pas vraiment à la classe d'utilisateurs - par exemple. GetByousername () ressemble à une méthode statique d'utilisateur au moins, mais ne serait-ce pas plus "propre" pour avoir une autre classe, disons "Usermanager" qui nous fournit ces tâches de gestion de l'utilisateur? Il semble qu'un peu étrange pour une instance utilisateur contienne la méthode authentifié (), par exemple, si c'est le système de sécurité qui l'authentifiant? P>
La chose à laquelle je m'inquiète est que je finis à suivre ce modèle au point où la classe d'utilisateurs n'est pas plus qu'une structure, et mes classes de gestion des utilisateurs et de Security Manager effectuent en réalité toute la méthode. Il ne se sent pas très "OO" d'avoir toutes ces classes de gestion manipulant des objets légers. P>
Toutes les pensées ou liens vers l'art antérieur sur cette affaire philosophique seraient appréciées! P>
7 Réponses :
La situation que vous décrivez est liée à si des objets suivent le modèle d'auto-entretien ou de l'adaptateur pour économiser sur un référentiel (c'est-à-dire la base de données). P>
Self-Servicing aurait des objets sauvegarder "eux-mêmes" comme dans La forme de l'adaptateur est souvent favorisée car elle supprime toute fonctionnalité de référentiel d'objets. P> MyObjectInstance.Save () code>, p>
Pourquoi appelez-vous adaptateur informatique? At-il quelque chose en commun avec ce modèle d'adaptateur? en.wikipedia.org/wiki/adapter_pattern
Martin Fowler a une utile Vues sur ce . P>
Le choix fondamental est entre le localisateur de services et l'injection de dépendance. Le premier point est que les deux implémentations fournissent le découplage fondamental manquant dans l'exemple naïf - dans les deux cas, le code d'application est indépendant de la mise en œuvre concrète de l'interface de service. La différence importante entre les deux modèles concerne la manière dont cette mise en œuvre est fournie à la classe d'application. Avec le localisateur de services, la classe d'application demande explicitement par un message au localisateur. Avec injection, il n'y a pas de demande explicite, le service apparaît dans la classe d'application - d'où l'inversion du contrôle. P>
L'inversion du contrôle est une caractéristique commune des cadres, mais c'est quelque chose qui vient à un prix. Il a tendance à être difficile à comprendre et à poser des problèmes lorsque vous essayez de déboguer. Donc, dans l'ensemble, je préfère l'éviter sauf si j'en ai besoin. Cela ne veut pas dire que c'est une mauvaise chose, juste que je pense que cela doit justifier l'alternative plus simple. P> blockQuote>
Cela vous ressemble à ce point où vous allez au-delà de la définition d'objets comme "un chien est-un em> animal" et d'entrer dans les définitions d'objet en termes de rôles Je recommanderais ce livre pour vous aider à faire cette transition et vraiment " obtenir em>": p>
objet Conception: rôles, responsabilités et collaboration p>
Je n'ai pas de réponse à votre question spécifique, car c'est une décision de conception aussi fondamentale que vous devriez vraiment apprendre sur la "image plus grande". Ce livre vous donnera une bonne fondation dans les principes et les techniques de conception axée sur la responsabilité. P>
Vous pouvez continuer à refroidir toutes les fonctionnalités de votre classe d'utilisateurs, mais comme vous l'avez dit, vous risquez de vous retrouver avec rien de gauche. À ce stade, vous pouvez choisir d'évaluer toutes les autres classes que vous avez créées, puis effectuez un jugement individuel sur chacune de ces classes, décidant du cas par cas si ces classes contiennent suffisamment de fonctionnalités pour justifier une toute nouvelle classe. < / p>
Si vous décidez que certaines de ces classes sont trop petites, vous pouvez ensuite remettre leur fonctionnalité dans la classe d'utilisateurs. Je ne vois rien de mal à avoir, par exemple, une fonction de validation de l'utilisateur plutôt que d'avoir une classe d'uservalidation avec une seule méthode sur celle-ci. P>
Cela ne se sent pas très "OO" d'avoir toutes ces classes de manager manipulant des objets légers. P> blockQuote>
Je ne sais pas si c'est très "OO", mais pour moi, il se sent très mvc et des séparations de préoccupations. Ayant des classes d'affaires très légères (au point, il s'agit de conteneurs de données), puis des objets de référentiel qui les déplacent autour est un modèle commun. P>
Je pense que vous êtes sur l'argent lorsque vous dites que ces méthodes peuvent ne pas appartenir à l'objet utilisateur. Les méthodes d'obtention / de recherche / sauvegarde peuvent être débattues, mais je suis d'avis qu'ils ne devraient pas être sur l'objet de l'entreprise eux-mêmes et doivent être effectués avec un référentiel (le motif de référentiel) ou via Objets de requête Si vous ne souhaitez pas abstrait votre orj dans un référentiel. p>
En ce qui concerne l'authentification, il serait préférable d'avoir un ensemble de classes qui est responsable de l'authentification et de laisser totalement l'objet d'utilisateur. Cet ensemble de classes pourrait être conscient de l'objet utilisateur ou mieux, il doit être au courant d'un contrat tel qu'un identifiant de compétence. p>
J'aime mettre cela d'une manière différente. Ces méthodes n'appartiennent pas vraiment au domaine car il n'y a pas de logique commerciale impliquée. Je veux utiliser le principe de la transcription de la commande et de la requête p>
getByouseName () - sa requête qui n'a pas vraiment besoin de logique commerciale p>
Authentifier (), VerifyLoginPassword () - Celles-ci sont la logique de validation qui n'est pas censée être faite dans le domaine .Veuillez référencer ce document Set Validation basée sur le domaine P>