私は、OO 設計スキルの向上に役立つアプリケーションに取り組んでいます。私は課題をほぼ完了しましたが、アプリケーションをより拡張可能にする必要があり、これを達成する方法についていくつかの情報が必要だと感じています。
問題のドメインは、次のように簡単に説明できます。
問題の領域は、ショッピング カート アプリケーションを設計することです。食品、書籍など、商品にはさまざまなカテゴリがあります。商品が対象となる税率は、商品のカテゴリによって異なります。明確に定義された税制があります。たとえば、10% の基本税は食品カテゴリに属する品目を除くすべての品目に適用され、すべての輸入品目には 5% の追加の輸入関税税が適用されます。
ここで注目したいのは、特定の税制に対するアイテムの適格性を決定するモジュールです。他の人やインターネットからのアイデアを使用して、以下の税モジュールの設計を考え出しました。
TaxCriteria :項目が TaxPolicy の対象となるために満たさなければならない条件を定義します。具体的な実装者は isEligible メソッドを実装し、アイテムがポリシーの対象となるかどうかを判断するためのビジネス ロジックを提供します。ImportedTaxCriteria の isEligible メソッドは、アイテムがインポートされているかどうかを確認します。
TaxPolicy : TaxCriteria、適用される税率、および税ポリシーの名前があります。TaxPolicy と TaxCriteria の関係は、指定パターンに基づいています。
SalesPolicy : 1 つ以上の TaxPolicy インスタンスで構成されます。
SalesEngine : SalesEngine には、SalesPolicy と TaxCalculator があります。applyPolicies メソッドには、アイテムのリストを含む Order が渡されます。applyPolicies は、注文の各アイテムを繰り返し処理し、販売ポリシーの各 TaxPolicy に対してその適格性を確認し、該当するポリシーに基づいて TaxCalculator を使用して税金を計算します。
新しい問題ドメイン:
国ごとに異なる販売ポリシーが定義されています。米国の輸入関税は 5%、中国の輸入関税は 3% になる可能性があります。この要件に対処するために、単純なファクトリ パターンを使用することを考えていました。SalesPolicy はもはやクラスではなく、TaxPolicy のリストを返す getTaxPolicies メソッドを持つインターフェースになります。USASalesPolicy と ChinaSalesPolicy は SalesPolicy を実装し、getTaxPolicies メソッドはそれぞれ特定の国に関する TaxPolicy のリストを返します。同様に、すべての国に独自の税計算調整があります。USATaxCalculator と ChinaTaxCalculator は、独立した実装を処理できます。
最後に、SalesEngine には、直接 SalesPolicy と TaxCalcualtor を渡す代わりに、コンストラクターで SalesPolicyFactory と TaxCalculatorFactory が渡されます。applyPolicies メソッドには、国を表す文字列である追加のパラメーターが渡されます。applyPolcies メソッドは国を SalesEngine のファクトリに渡し、それらを使用して、税金の計算に使用される適切な SalesPolicy および TaxCalculator インスタンスを作成します。
これが、これまでの私の思考プロセスです。ファクトリ パターンで明確に定義された設計原則を正当化していますか? SalesPolicy と TaxCalculator が関連製品のファミリを表すように、抽象ファクトリ パターンを使用するにはどうすればよいですか? 私が使用したものよりも問題を解決するためのより良い方法はありますか?