私は貧血ドメインモデルを持つレガシーシステムで作業しています。レガシーシステムのリポジトリにアクセスするリファクタリングドメインロジック
このドメインのエンティティクラスは、Car
,CarType
、CarComponent
、CarComponentType
です。
それぞれについて、別個のリポジトリがあります。これらのリポジトリにアクセスし、基本的にすべてのロジックを含む多くのサービスもあります。
ベンダーがCarComponentType
を廃止できるかどうかを判断する方法を実装する必要があります。そのロジックは次の通りです。今日、そのコンポーネントを持つ既存の車がない場合に限り、コンポーネントを中断することができます。
最初は、これをサービスクラスで実装しました。
public boolean canBeDiscontinued(CarComponentType carComponentType) {
List<Car> cars = carRepository.getCarsWithComponent(carComponentType);
return cars.isEmpty();
}
これは機能しますが、このロジックはコードの他の場所から使用されます。それは成長かもしれないが、それは代わりに内部CarComponentType
クラスを合うことができる何かのようになります。
public boolean canBeDiscontinued() {
List<Car> cars = carRepository.getCarsWithComponent(this);
return cars.isEmpty();
}
しかし、それはリポジトリにアクセスする必要があるので、私は、そこにそれを置くことができない(と私はそれを理解してエンティティがデータアクセス層を認識するための非常に深刻な反パターンです)。コンポーネントタイプをロードすると、そのタイプのカーはすべてロードできません。何千ものオブジェクトになる可能性があるからです。私たちはORMを使用していないので、かさばるだけでなくエラーが起こりやすいために、遅延ロードされたコレクションを作成します。
私が最初にやったように、サービスクラスで実際にこのメソッドを使用する方が適切ですか?それは重要ではないですか?別の選択肢がありますか?別の出発点からリファクタリングを開始する必要がありますか?
同様の質問hereがあります。しかし、私の質問はJavaに関連しているので、私の解決策は私の場合は当てはまりません。また、私のドメインモデルとして自動車やコンポーネントを使用することについては、事前に申し訳ありません。おそらく、少し短いものの:)
スペックの実装はどのレイヤーですか?インフラ? – Chris
「ドメイン概念」が仕様に実装されているため、仕様はドメイン層の不可欠な部分です。 –