2016-06-16 4 views
4

いくつかのDTOクラスにいくつかのフィールドが繰り返してある場合、SOAで使用します。コンポジションや継承を使用して繰り返しがないようにするか、すべてのフィールドをカプセル化する1つのDTOクラスを使用する方が良いですか?DTOクラスが大きくなるにつれて、繰り返しのフィールド名が多く見え、Sonarレポートは泣いています。最善のアプローチ(または代替)は何ですか?DTOで継承またはコンポジションを使用する必要があります。

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

DTOと別のDTOとの関係が "is a"の場合、継承を使用する必要がありますか? DTOが別のものと「関係がある」関係を持っている場合、それは構成を使用すべきですか?これらはあなたが求めている本当の質問です。継承や構成は、それ自体が終わりではありません。 – scottb

答えて

9

「1つのDTOクラス」アプローチはほぼ確実に悪いです。それは神のように匂いがする。多くの専門家がDTOを全面的に搾取している。いくつかの基底クラスから継承することができますが、値オブジェクトの場合、それは実際には分かりません。コンポジションと同じです。コードが複雑になります。 "DocReview"フローをデバッグするときは、2つ、3つ、またはそれ以上のDTOクラスを調べて、いずれかの方法でそれを理解する必要があります。ブリー!また、各DTOは通常、別々のセマンティックドメインにあります。「Doc」は「DocReview」ではありません。したがって、見かけの「共通」要素は実際には共通ではありません。彼らは実装タイプを共有するだけです。その意味は全く異なっている。

たとえば、多くのドメインがIdentifierという概念を共有している場合など、メンバータイプが本質的にコンポジットである場合、そのドメインのDTOに構成するタイプを作成できます。あなたの例では、あなたはここで

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

キーがIdentifierは、両方のドメインで意味的に等価であるということであるかもしれないので、それは一般的なタイプとしてそれを持っていることは理にかなっています。さもなければ、あなたはそれをしません。

サイドバー:接尾辞としての "Dto"(または "DTO")は実際には良い名前ではありません。

+0

ルーは言った...一般的に継承を避け、構成を好む。継承は多型の良い習慣です(Car - > Ferrari - > Model XXX) –

+0

共通のフィールドをクラスに抽出してコンポジションを使用することは理にかなっています。私は、命名規則xxxDtoは厄介だと思っていますが、Docという名前のエンティティがありますので、区別するための方法が必要です。あなたは - 多くの専門家がDTOを全面的に搾取していると言いました。なぜそれがあり、どのような選択肢がありますか? – pingu

関連する問題