によるとこの質問Stack Overflow によると、DDD アーキテクチャでは、「ヘルパー」クラスは目的に応じて異なるレイヤーに配置できます。たとえば、ユーザーフレンドリーな方法で何かをフォーマットするヘルパーは UI に配置されます。データベース ヘルパーはインフラストラクチャに配置されます。
しかし、複数のレイヤーで使用できるヘルパーはどうでしょうか。たとえば、年齢の計算です。年齢は、ビジネス ロジックのモデル レイヤーで必要になる場合があります。年齢は複数のエンティティで使用されるため、特定のエンティティには含めないでください。また、UI での表示目的のためだけに年齢が必要な場所もあります。同様に、複数のレイヤーで使用できる文字列関数があります。たとえば、カスタムの Right メソッドと Left メソッドは、UI での書式設定に使用できますが、プレフィックスに基づく条件付きロジックなど、モデルでも使用できます。
では、これらの一般的なメソッドはどこに配置すればよいでしょうか? 私の設定は次のとおりです。
- インターフェース
- 応用
- モデル
- インフラストラクチャー
モデルはコアであり、インフラストラクチャに依存しないため、共通ヘルパーはインフラストラクチャに入ることができません。私は 2 つのオプションを検討しています。
1) どのレイヤーでも使用できる Common または類似のレイヤーをもう 1 つ用意します。これにより、Model と Common の間に依存関係が作成されます。
2) 必要なレイヤーでヘルパー ロジックを複製します。たとえば、UI に Age ヘルパーがあり、モデルにも Age ヘルパーがあるなどです。これは DRY に違反しますが、ドメインが「共通」レイヤーに依存する必要はありません。
どちらのオプションがよいでしょうか? モデル レイヤーが「共通」レイヤーに依存していても問題ありませんか?
アップデート:
この質問がされてから 2 年半が経ち、私は次のような結論に達しました。
- フレームワークの制限を補う Right、Left などのものは、モデル/ドメイン レイヤーも依存する「共通」ユーティリティ/ヘルパー コンポーネントに属します。
- 「共通」ユーティリティ/ヘルパー コンポーネントは、それほど大きくすべきではありません。経験を積むにつれて、ヘルパーと考えていたものの多くが、実際にはドメイン モデルに属していることがわかりました。
- 年齢はドメイン レイヤーの独自のクラスに属します。住所、電話番号、金額などと同じように、私はこれらを値オブジェクトと見なしています。値オブジェクトを理解することは、他のクラスに組み込むことができる再利用可能なドメイン クラスを作成する方法を理解する上で非常に重要でした。
ベストアンサー1
文字列ヘルパーは少し異なると思います。その場合、カスタムの Right メソッドと Left メソッドは、実際には言語/プラットフォームの組み込み文字列型の制限を補正しています。これはアプリケーションとは何の関係もないため、この場合はグローバルにアクセスできるようにしても問題ありません。
年齢計算の例は、アプリケーション/ドメインの本質的な部分である動作/ロジックをカプセル化しているため、もう少し興味深いものです。その場合、各レイヤーで動作を複製する価値があるかどうか(SRPを優先してDRYに違反する)をケースバイケースで評価する価値があるかもしれません。これは難しい決定です。現在は同一かもしれませんが、動作を複製することで、2つのメソッドが将来的に互いに分岐する機会を与えていることになります。これは通常、次の場合に発生します。変化するさまざまな理由。