0

最近、私が取り組んでいるプロジェクトで、次のような問題に巻き込まれました。

(ツリーのような) データ構造のセットがあるとします。

販売契約
    買い手
        住所
            街
            電話
        ファイナンス
    売り手
        住所
    アイテム
        価格
        もの
    他のもの

そして、SellingContractいくつかのビジネス フレーズを通過し、それぞれがSellingContract特定の条件を満たしているかどうかを判断するためにデータをチェックする必要があります。

最初に、トップ コンテナー ( SellingContract) がすべての条件チェッカー メソッドを提供するようにします。

SellingChecker.tooMuchItems()
SellingChecker.canProceedToStepXXX()

しかし、新しい条件が発生するたびに、SellingContract.

この問題を解決するためのエレガントな方法を提案してくれる人はいますか?

現在、次の 2 つの方法を検討しています。

  1. にビジター パターンを適用するとSellingContractSellingContractはメソッドを提供しacceptConditionChecker(ConditionChecker)、条件チェッカーは インターフェースを実装しますConditionChecker

  2. SellingContractパラメータとして受け取るユーティリティ クラスを作成し、状態を確認します。このアプローチでは、ユーティリティ クラスが構造を知っている必要があり、SellingContract手続き的なように思えます。

4

2 に答える 2

0

一連の責任パターンを検討します。各ハンドラーは 1 つの条件をチェックし、問題がなければ次のハンドラーに情報を渡します。

于 2012-09-28T08:55:26.307 に答える
0

SellingContractまず、すべての条件チェック メソッドを提供するのは良くないと思います。クラスは、データを保持し、データへのアクセスを提供することにのみ関係する必要があります。

あなたの2つのアプローチについて:

  1. 訪問者パターンはここでは役に立たないと思います。その適切な適用のために、訪問者はさまざまなタイプのオブジェクトを訪問できる必要があります。あなたの場合、これは異なるタイプSellingContractまたは多分Contractです。また、実際に役立つようにするには、さまざまなタイプのビジターが必要です。しかし、それはConditionChecker何でしょうか。要約すると、訪問者パターンはここでは役に立たないと思います。
  2. このアプローチは理にかなっているようです。SellingContractユーティリティ クラスが構造について知っていることは問題ではないと思います。実際には、そのパブリック インターフェイスを知る必要があるだけです。しかし、オブジェクトについて何も知らずに、そのオブジェクトの状態を合理的にチェックすることはできないため、ここでは問題は見られません。また、あなたの要件はとにかく段階的な手順を暗示しているので、アプローチが小さな手順である場合は大きな問題ではありません. このアプローチをお勧めします。

条件については、条件ConditionCheckerごとに 1 つ記述してから、それらの条件を段階的に適用するクラスを記述できます。これにより、お気に入りの IDE でコードをステップ実行して中間結果を確認するなどの操作を簡単に実行できるため、コードのデバッグと読み取りが容易になります。

私が現在取り組んでいるプロジェクトでは、同様の問題がありました。学生データを操作し、それらが学位のすべての条件を満たしているかどうかを確認し、どの条件が満たされ、どの条件が満たされていないかについての情報をユーザーに提供します。2 番目のアプローチを使用しましたが、うまく機能します。また、当社のソフトウェア アーキテクトも、これが優れたソリューションであることに同意しています。

オプションで、条件とルールを指定するためのドメイン固有の言語を実装できます。これにより、ビジネス自体に条件を記述させることができます。しかし、これを実装するにはかなりの労力が必要です。

于 2012-09-28T09:01:57.903 に答える