2016-06-16 39 views
4

In SOA, wenn einige DTO-Klassen einige Felder haben, die übergreifend wiederholt werden. Ist es besser, Komposition oder Vererbung zu verwenden, so dass es keine Wiederholung ODER nur eine DTO-Klasse gibt, die alle Felder einkapselt. Während meine DTO-Klassen wachsen, sehe ich viele sich wiederholende Feldnamen und Sonar-Bericht ist heulen Geflügel. Was ist der beste Ansatz (oder eine Alternative)?Sollten DTOs Vererbung oder Zusammensetzung verwenden

z.B.

public class DocDto{ 
private Long id; 
private String name; 
private String docType 
} 

public class DocReviewDto{ 
private Long id; 
private String name; 
private String status; 
private String comment; 
} 
+1

Wenn ein DTO eine "ist a" -Beziehung zu einem anderen DTO hat, sollte dann Vererbung verwendet werden? Wenn ein DTO eine "hat eine" Beziehung zu einem anderen hat, sollte es Zusammensetzung verwenden? Das sind die wirklichen Fragen, die Sie stellen möchten. Vererbung oder Zusammensetzung sind keine Selbstzweck. – scottb

Antwort

9

Die "one DTO Klasse" Ansatz ist fast sicher schlecht. Es riecht nach einer Gottklasse. Viele Experten kritisieren DTOs insgesamt. Sie könnten von einer Basisklasse erben, aber für Wertobjekte ist es nicht wirklich sinnvoll. Gleiches für die Zusammensetzung. Es macht Ihren Code komplizierter. Beim Debuggen des "DocReview" -Flusses müssten Sie sich zwei, drei oder mehr DTO-Klassen ansehen, um sie mit beiden Ansätzen zu verstehen. Bleagh! Außerdem befindet sich jeder DTO typischerweise in einer separaten semantischen Domäne: "Doc" ist nicht "DocReview". Die scheinbaren "gemeinsamen" Elemente sind also überhaupt nicht üblich. Sie teilen nur einen Implementierungstyp; ihre Bedeutungen sind sehr unterschiedlich.

Wenn der Elementtyp inhärent zusammengesetzt ist, z. B. wenn viele Domänen das Konzept einer Identifier teilen, könnten Sie einen Typ für die Zusammensetzung in die DTOs für diese Domänen machen. In Ihrem Beispiel könnten Sie

public class Identifier { 
    long id; // should be a 'String', actually 
    String name; 
} 

public class Doc { 
    private Identifier identifier; 
    private String docType 
} 

public class DocReview { 
    private Identifier identifier; 
    private String status; 
    private String comment; 
} 

Der Schlüssel hier ist, dass Identifier in beiden Domänen semantisch äquivalent ist, so macht es Sinn, es als eine gemeinsame Art zu haben. Sonst würdest du das nicht tun.

Sidebar: "Dto" (oder "DTO") als Suffix ist nicht gut Benennung, wirklich.

+0

Was Lew sagte ... im Allgemeinen vermeiden Erbschaft und bevorzugen Zusammensetzung. Vererbung ist eine gute Übung für Polymorphie (Auto -> Ferrari -> Modell XXX) –

+0

Herausziehen von gemeinsamen Feldern in eine Klasse und die Verwendung von Komposition macht Sinn. Ich stimme der Namenskonvention xxxDto zu, ist peinlich, aber wir haben Entitäten mit dem Namen z. B. Doc, also muss man etwas differenzieren. Du hast gesagt: Viele Experten kritisieren DTOs überhaupt - warum ist das so und welche Alternativen haben wir? – pingu