私は、製品の価格がさまざまな要因に基づいてさまざまな税額を持っているシステムを設計するタスクを与えられました。
たとえば、米国ではいくつか、地域に基づくものと州に基づくものなどがあり、EUではVATがあります。私は、顧客と製品、および場所または店舗のさまざまな要因に基づいて、さまざまな税金が適用されるハードコーディングされていない方法を理解しようとしています。
誰かがこの問題に簡単に適用できる既存のソリューションについてのアイデアを持っていますか?
私はまた、そのようなデザインの質問を一般的に解決する方法を学ぶための一般的な答えを受け入れます(構造化されたアプローチの作成をガイドする本のように)
Craig Larman'sApplying UML and Patterns は、外部税サービスの問題に対処します(実際のサービスは、Googleを使用すれば存在します)。結果をシステムが予期する形式に変換するGang-Of-Fourオブジェクトアダプター。
Strategyは大丈夫かもしれないと思いますが、存在するすべての税アルゴリズムのコードを維持できると考えるのは野心的です。すべての選挙では、コードを変更する必要がある可能性があり、場合によっては地方自治体当局(?)による検証が必要になることもあります。
ご指摘のとおり、税金は複雑です。セールには複数の行を含めることができます(ケベックではTVQとTPSがあり、かつては課税されていました!)。米国の一部の州では、衣料品や食品などに課税されていません。これらの側面を抽象化するために、ドメインモデルでTaxLineItem
を使用したラーマンの概念設計(セクション26.3を参照)。外部サービスがそれらを作成します(ロジックは外部サービスにあります)。
これがそのアイデアの大まかなUMLダイアグラムです。
アダプターの場合、26.1では次のようになります。
アダプターの使用:
1つの解決策は、さまざまな税金を、各製品に追加するオブジェクトにして、価格の計算に使用することです。たとえば、次のような抽象基本クラスまたはインターフェースがあるとします。
_class ITax {
calculateTaxForPrice(Price amount);
};
_
次に、特定のサブクラスは、次のようにさまざまなタイプの税金の計算を実装します。
_class VATTax : public ITax {
calculateTaxForPrice(Price amount);
};
class StateSalesTax : public ITax {
calculateTaxForPrice(Price amount);
};
_
次に、製品に追加する必要がある税金のリストがあります。
_class Product {
public:
addTax(ITax someTax);
Price getPrice();
Price getPriceWithTaxes();
private:
array<ITax> taxes;
};
_
getPriceWithTaxes()
では、価格を取得して、taxes配列の各要素に税を追加します。
このシナリオでは、たとえば、特定の製品を特定の税金から免除することができます。各製品に必要なものだけを使用できます。