Je n'ai personnellement pas que mes entités implémentent des interfaces. Pour une tâche code> code> classe, je n'aurais pas Je l'ai vu faire plusieurs fois cependant, alors je «Je me demandais où provient ce conseil et quels avantages vous en reçoivent. P> Si vous utilisez un orj, alors l'argument indiquant« Je peux changer mon accès de données »est donc de savoir quel autre La raison est là pour faire cela? p> itask code> qui vient d'avoir les mêmes propriétés définies sur elle.
Un bon point a été fait dans les commentaires sur inotifypropertychanged code>. Ce n'était pas mon point, je parle d'avoir quelque chose comme ceci: p>
5 Réponses :
L'avantage majeur de ceci est qu'il s'agit d'une façon d'exposer votre entité comme une version "en lecture seule" (tant que votre interface n'expose pas de setters bien sûr). P>
Est-ce un oui à faire?
Nous faisons beaucoup de tests unitaires et que vous voulez souvent vous moquer de choses que nous ne testons pas. Bien que je n'aime pas cela, nous avons fini par utiliser des interfaces partout, car il est beaucoup plus facile de se moquer de choses à se moquer.
En théorie La plupart des cadres moqueurs peuvent aussi se moquer de classes normales, mais dans la pratique Nous avons fait des problèmes parce que nous faisons parfois des choses intelligentes avec la réflexion et que le type de la classe moquée n'est pas la même chose que l'original. Donc: P>
var myTask = MyIoCProvider.Get<ITask>(); var taskType = typeof(myTask);
Je vois. Cependant, pourquoi retourneriez-vous des entités de votre conteneur IOC? Parlons-nous de tests unitaires d'objets de domaine complet sur des données et de comportement qui ont des dépendances sur d'autres objets de domaine et vous souhaitez vous moquer de ces dépendances?
Dans notre cas, nous avons une distinction entre des objets de données tels que "Tâche" et des objets logiques commerciaux tels que "TaskAssignmentManager". Les objets de données pure n'ont pas de logique en eux, vous n'avez donc pas besoin de moquer, du CIO ou des interfaces. Si nous avions des objets de domaine qui avaient à la fois la logique et les données, je pense que nous vous retrouverons avec des interfaces sur eux.
Si vous pensez à utiliser des domainesVents que de structures de données telles que la tâche, il faut vraiment implémenter une interface ou similaire si vous avez une couche d'accès à des données courante qui pourrait avoir besoin Prendre dans une classe de base standard d'Ientitity, mais je n'aurais aucune interface pour chaque type s'il ne s'agit que d'une structure de données que vous décrivez dans votre message. p> Lorsque vous manipulez des objets de domaine qui exposent réellement comportement, vous pouvez alors avoir une interface pour les tests d'unités. P> P>
Je suis descendu cette route une fois (interfaces pour des objets de valeur). C'était une douleur royale à l'arrière, j'ai recommandé contre elle. Les arguments communs pour ce sont: p>
moqueur: strong>
Ce sont des objets de valeur. Rien à se moquer. Plus la moqueur finit par devenir une forte douleur que d'écrire un constructeur (en Java) ou d'utiliser les arguments nommés de choses en C #. P>
N'oubliant pas aussi que XMLSerializer Flat Out refuse de sérialiser des interfaces ou de désérialiser avec une interface.
Comment faire le deuxième point (Vues de lecture) sans utiliser d'interface?
Je rends généralement les choses immuables par défaut. Sinon clone avant de remettre quelque chose de "dangereux" ou de fournir une interface en lecture seule.
Est-ce un oui ou un non?
C'est un non. Ne créez pas d'interfaces pour les DTO.
Je pense que certains programmeurs utilisent simplement des interfaces, car ils entendent des interfaces sont bonnes, ils ont donc fini de les utiliser partout sans réfléchir à des avantages et de contre. P>
moi personnellement, je n'utilise jamais d'interfaces pour des entités qui représentent uniquement un morceau de données comme la rangée de DB par exemple. P>
Un mot: inotifypropertychangned
Cela doit avoir besoin de plus de balises.
@bmargulies S'il vous plaît n'hésitez pas à re-étiqueter si vous le souhaitez. Je ne voulais pas que cela soit spécifique à la langue et que les «meilleures pratiques» ne soient pas conseillées comme une balise, cela n'était donc pas sûr de quoi utiliser d'autre.
Personne n'a utilisé le terme "entité" dans ce sens en Java, alors je pense que c'est c # -pecific.