1

ドメイン層がコントローラーによって UI から分離されている Java アプリケーションがあります。問題は、これらのコントローラーがドメイン オブジェクトを返すことができ、ドメイン オブジェクトをパラメーターとして持つことができることです。

これらの返されたドメイン オブジェクトの一部は変更可能であり、これを防止したいと考えています。UI(または将来のUI)がコントローラにアクセスせずにドメインを直接変更できないようにしたい.

私は2つのオプションを試しました:

  • 最初のものでは、各クラスがゲッターのみを含む「変更不可能な」インターフェースを実装していることを確認しました。また、オブジェクトを UI に返す必要がある場合は、その「変更不可能な」インターフェイスを返しました。UI がゲッターのみを表示できるようにします。これに伴う問題は、それらがまだ元のオブジェクトに簡単にキャストでき、アクセスが得られることです。最初はこのレベルのセキュリティで十分だと思っていましたが、誰かが誤ってオブジェクトをキャストして間違った方法で使用し、整合性が侵害されたことがありました。

  • 2 つ目では、返される可能性のある各オブジェクトに変更不可能なラッパーを提供しようとしました。しかし、問題は、これらの返されたオブジェクトがコントローラーのメソッドのパラメーターとして使用できるため、コントローラーでアンラップする必要があることです。uwrap()メソッドをパッケージ プライベートにしようとしましたが、特定のすべてのラッパー クラスをコントローラーと同じパッケージに配置する必要があり、これは少し不便です。

編集:3番目のオプション:

  • ( vicに感謝します) 3 番目のオプションでは、オブジェクトは変更不可能なwrapperによってラップされますが、このラッパーによってラップを解除することはできません。各 Unmodifiable は、Hashmap 内のその変更可能なオブジェクトにリンクされています。したがって、「ラップ解除」は、変更不可能なオブジェクトにリンクされている変更可能なオブジェクトを取得することによって行われます。

オブジェクトを変更不可にしてコントローラーから返せるようにし、コントローラーに戻されたときに再度変更可能にする方法を知っている人やアイデアを持っている人はいますか?

4

2 に答える 2

2

オブジェクトの状態を表すには、Stateデザイン パターンが最適です。

基本的に、UI がドメイン オブジェクトを表示する必要があるときはいつでも、コントローラーはオブジェクト自体のスナップショットを表す不変の DTO オブジェクトを UI に提供します。これにより、UI レイヤーがドメイン オブジェクトの不変のスナップショットのみを持つように制限されます。UI がドメイン オブジェクトを変更する必要がある場合、不変の状態オブジェクトをコントローラーに送信します。コントローラーは、それらを使用して、対応するドメイン オブジェクトを内部的に変更します。

于 2012-02-18T14:39:09.803 に答える
2

コントローラーがオブジェクトの可変バージョンをプライベートに保存し、その不変バージョンを「外界」に返すとどうなるでしょうか。変更可能なバージョンにはある種の一意の ID があり、コントローラーは何らかの種類で検索することで ID を取得できunwrapますCollection

于 2012-02-18T14:27:52.783 に答える