2017-06-01 3 views
0

類似した質問がここに投稿されましたClean code - how to design this class?DTOの動作をどこに置くのですか?オブジェクトとデータ構造のクリーンコード

私はまだ答えを見つけられません、私は混乱しています!

"クリーンなコード"という本も読んでいます。データ構造/動作が混在していないデータ構造であっても動作しているオブジェクトであっても、データ構造/オブジェクトを混在させるべきではありません。

私のアプリケーションには、外部サービスからのデータを運ぶデータ転送オブジェクトがあります。これらのDTOには、データアクセッサとミューテータだけがあります。だから私はそれらをデータ構造体の型として考えていました。

しかしロバート・マーティンは...それがクリーンであるisMarried機能の使用が唯一のクライアントクラスから属性としてclient.isMarried()が、私は、これは論理たisMarried(client)よりも優れていることを彼の本の中で言っています。

私のアプリケーションの多くの領域では、特定のDTOで何らかの動作が必要ですが、この動作をどこに置くのが混乱しています。 我々は

ClientUtils { 

    boolean isMarried(Client client) { ...} 
    String getCompleteName(Client client) { ...} 

} 

のようなビジネスロジックを持つUtilsのクラスを作ってきた、これはサービス層に行くべきでしょうか? (DAL、services ..)

+0

なぜこれらの操作は 'client'クラスにしかありませんか?おそらく、そのクラスは単純なDTOよりも多くのモデルに進化しているでしょうか?もしそうでないとしても、そのロジックがそのDTOに合理的に属していれば、DTOに*ロジックを入れることはひどいことではありません。そのクラスがロジックが動作する唯一のクラスであり、それが必要なシステム内の唯一の場所であれば、そのクラスに属します。 – David

+0

My classクライアントクラスも外部ライブラリにあります。編集することができないため、クライアントクラスも拡張することしかできません。 –

+0

https://softwareengineering.stackexchange.comで尋ねられるはずです。 – VGR

答えて

0

外部ライブラリの制約のためにClientクラスを変更することはできないため、私はこれらのメソッドが入力オブジェクト以外のものを操作しなくても、それを拡張しません。 ClientInfoラッパークラスを作成することをお勧めします。

class ClientInfo { 
    private Client myClient; 

    public ClientInfo(Client c) { 
     myClient = c; 
    } 

    public boolean isMarried() { ...} 
    public String getCompleteName() { ...} 
} 
0

あなたは私に言わせれば、その後、Utilsクラスはちょうどあなたが実際のビジネス・ロジックが含まれているどこかの長引くランダムな静的メソッドがあることを意味します。 DTOをDTOとして保持し、isMarriedメソッドを持つClientManagerクラスを作成するのはなぜでしょうか?

外部オブジェクトをラップするClientInfoアプローチは、ドメイン駆動型セキュリティによって駆動される可能性のある別のオプションです。

関連する問題