9
votes

Les entités doivent-elles mettre en œuvre des interfaces?

Je n'ai personnellement pas que mes entités implémentent des interfaces. Pour une tâche classe, je n'aurais pas itask qui vient d'avoir les mêmes propriétés définies sur elle.

Je l'ai vu faire plusieurs fois cependant, alors je «Je me demandais où provient ce conseil et quels avantages vous en reçoivent.

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?

mise à jour:

Un bon point a été fait dans les commentaires sur inotifypropertychanged . Ce n'était pas mon point, je parle d'avoir quelque chose comme ceci: xxx


4 commentaires

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.


5 Réponses :


1
votes

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


1 commentaires

Est-ce un oui à faire?



1
votes

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);


2 commentaires

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.



0
votes

Si vous pensez à utiliser des domainesVents que de structures de données telles que la tâche, il faut vraiment implémenter une interface xxx

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.

Lorsque vous manipulez des objets de domaine qui exposent réellement comportement, vous pouvez alors avoir une interface pour les tests d'unités.


0 commentaires

3
votes

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:

moqueur: 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 #.

Vues réadonnées: Je dois admettre que je préfère toujours rendre quelque chose immuable par défaut, ce qui ne le rendait que mutable s'il est absolument nécessaire.

fonctionnalité cachée: Généralement, la portée a couvert celui-ci pour moi.


5 commentaires

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.



0
votes

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.

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.


0 commentaires