2


0

プロパティcustomerTypeを持つCustomerクラスがあるとしましょう。

私はSpecialContractのような何かと呼ばれる別のクラスを持っています。それはCustomerと他のいくつかのプロパティを持っています。

customer.customerType == SPECIALの場合、この特定の顧客への参照を持つSpecialContractがあります。

さて、これはちょっと面倒ですが、いくつかの理由でCustomer から SpecialContractへの関係を維持することは望ましくありません。その理由の1つは、SpecialContractsを読み込む必要がないということです。 SpecialContractsに関連する他のすべてのデータ。 しかし、私はいつもCustomerにSpecialContractがあるかどうかを知りたいと思っています、そしてそれはcustomerTypeプロパティを通して達成されます。

わかりました、これは難しい部分です。 クライアントがcustomerTypeを設定できるようにしたくないのは、そうするだけでは顧客に適用されるSpecialContractが削除されないためです。 私はむしろ、クライアントにSpecialContractを削除するためのサービスメソッドを呼び出すことを強いるでしょう。これはまた、customerTypeをNOTSPECIALにすべて1つのトランザクションで設定するでしょう。

customerTypeセッターをクライアントから隠すことができますが、それでも正しい値を設定し、SpecialContractを削除する役割を果たすサービス層クラスに公開するにはどうすればよいですか。 私のサービスクラスは、Customerクラスと同じパッケージにはありません。

4 Answer


1


多分アスペクト指向プログラミングはここでいくらか役に立つかもしれません。 契約を通過した顧客への呼び出しを傍受し、特定の条件が与えられた場合にbeforeメソッドのアドバイスにSpecial Contractサブクラスをインスタンス化させ、それをメソッドに渡すことができます。 あなたはそれが厳密にLiskov置換の原則を守るように契約階層を設計する必要があります。

AOPはこれを流血の不可能な混乱に変えるかもしれませんが、それについて考えるのは別の方法です。 あなたは好きなだけ多くのルールを追加し、宣言的にそれらをオフまたはオンにすることができます。


1


`+ Customer `が実装する ` Interface `を作成し、この ` Interface `のインスタンスをクライアントに渡すことができます。 この ` Interface `は ` contentType `修飾子をクライアントに公開しません。 サービスは本格的な ` Customer `オブジェクトを処理し、 ` Class `で定義されている ` setContentType +`修飾子を使用できます。


1


私はあなたのクライアントからセッターを隠そうとしないでしょう。 そうではなく、クライアントが顧客の状態を変更してそれを保持しようとする場合は、SpecialContract / customerTypeが不適切に変更されたかどうかを確認し、変更されている場合はおそらく例外をスローする必要があります。 その後、先に参照したメソッドを作成して、SpecialContract / customerTypeを適切に更新することができます。

全体的に、このチェックを永続化レイヤの近くで実行して、データが送信されて盲目的に永続化されるのではなく、データが保存される直前に正しいことを確認する責任があるようにするのがはるかに安全です。


0


起動時にシステムをスキャンして、「+ SpecialContract 」の参照を持つすべての「 Customer 」を検索し、これらすべての「 Customer +」のリストをサービスレイヤーなどのプライベートな場所に保存してくださいどこか?