2009-12-22 7 views
1

Nous avons une entité (classe) contenant des données et des méthodes (appelons-la Person). Il y a d'autres classes qui ont besoin d'utiliser les données dans cet objet (appelons l'un d'entre eux Comptable), mais n'ont pas besoin d'utiliser la fonctionnalité dans ses méthodes. Serait-il préférable d'envoyer l'objet Person entier à Accountant, ou de créer un nouvel objet PersonData juste pour contenir les données et les envoyer à l'obj Accountant?OO/DTO Question d'architecture

Nous avons un cas dont nous avons besoin de comprendre cela, mais j'aimerais connaître la meilleure réponse générale afin que nous puissions l'utiliser tout au long.

Répondre

4

En règle générale, vous devez transférer un DTO où vous devez consommer les données sous une forme sérialisée, par exemple sur un service Web ou dans un client intelligent. Si vous utilisez simplement l'objet Person dans le domaine, et que vous avez encapsulé correctement, pourquoi faire l'effort de créer un DTO?

1

Je dirais que la POO voudrait que vous utilisiez des méthodes 'get' telles que définies dans la classe de personne. Je n'aurais pas envoyé l'objet entier comme comptable n'a pas besoin de l'objet entier, juste les données sélectives. Je ne dirais pas ce dernier car vous créez une redondance massive inutile.

Mais POO comme celui-ci est très idéalisée, donc il peut être préférable de le faire d'une autre manière ...

1

Je généralement l'utilisation de la réserve de DTO pour la transmission de la couche croisée des données. Si ce n'est pas le cas, je ne suis pas sûr d'une raison impérieuse d'en créer un.

0

Je pense que c'est une question de limites de confiance. Dans une application métier, les limites de confiance dictent généralement votre architecture de couche. Si votre «comptable» est en dehors de la limite de confiance de la personne, il devrait y avoir une sorte de transformation de modèle. L'architecture et les exigences doivent dicter quel type de transformation.

2

comme indiqué par d'autres, il n'y a pas de véritable point à l'aide de DTO, sauf s'il n'y a pas de transfert impliqué ... :)

la solution que je propose, serait abstraite l'objet passé à Accountant à une interface IAccountee et ont Person mettre en œuvre ... Je ne suis pas familier avec C# (à partir de votre profil, j'inférer c'est langue de votre choix :)), mais cela ne devrait probablement vous orienter vers la droite:

class Accountant { 
    //.... 
    public void performAction(IAccountee target) 
    { 

    } 
} 
interface IAccountee 
{ 
    string Name 
    { 
     get; 
    } 
    int Salary 
    { 
     get; 
     set; 
    } 
} 

class Person : IAccountee 
{ 
    //implementation here, as well as some stuff specific to Person 
} 

en gros, c'est le D en SOLID :) ... c'est pour autant que je sache, les interfaces C# ne peuvent pas nécessiter de variables (comme dans la plupart des langues), ce qui vous oblige à créer des accesseurs (à moins qu'il y ait un langage)./IDE pour générer des accesseurs simples par défaut) si vous ne l'avez pas encore fait ... cela prend un peu plus de temps que d'utiliser des variables simples, et nécessite plus de performances qu'un simple accès au champ, mais OTOH, c'est aussi ça Considérons une bonne pratique, au moins quand les choses ne sont pas performantes ... Je pense que c'est vraiment plus élégant que de créer une classe DTO supplémentaire et de copier des données (ou au moins dans une direction) ...

J'espère que cela pourra aider ... ;)

+0

Pourquoi utiliseriez-vous IAccountee: est-ce simplement pour le passage facile de variables ou y at-il quelque chose qui me manque? – silentcontributor

+0

il est découplage comptable de la personne et de cacher immanemment tout ce qui est nécessaire pour comptable à comptable lui-même ... – back2dos

+0

Ah, assez juste. Merci. – silentcontributor