以下は許容できますか?
class Person {
Person(IStorageService) { } ...
void Save() { } ...
}
この依存関係は意味がありません。
特定のストレージ実装にバインドしないため、 aPerson
をに強く結び付けるわけではありませんが、そのような依存関係は意味がないと主張します。Storage
動詞としてのメソッド
クラスのメソッドは、その型によって実行される動詞と考えてください。そのタイプのインスタンスに、そのローカル ドメインに関して「何かをする」ように指示しています。
私が人として、 とはどういう意味Save
ですか?
- 保険会社を切り替えて、コストを最大 15% 削減しましたか?
- 私は贖罪の神ですか?
- 私の魂をオートマトンにダウンロードしましたか?
ストレージ サービスは可能であり、すべきSave
です。人々はできないSave
し、できることを宣伝すべきではありません。
靴べらにしようとしている
SaveTo
もっと理にかなっているかもしれません-つまりpublic void SaveTo(IStorageService storage)
。
しかし、あなたは人が自分自身をストレージに保存する方法を知る責任があると言っています. 私の意見では、これはSRP の違反です。また、Domain Analysis の欠落部分も示しています。
のドメインには、Person
保存、保管などに関するものは何も含まれません。ドメインのそのレベルでの人と他のものとの相互作用が含まれます。データ永続性のドメインは、Save
メソッドにとってより適切な場所です。
Person
問題領域 (その抽象化レベル) にある場合はStorage
、ソリューション領域にあります。
ロジックをどのように分離する必要があるか
ここには 3 つのロジックがあります。
Person
-「人のこと」について知っている
Storage
- 特定のタイプのストレージと、それにアクセスする方法を知っている
Storage of Person
- 人が保管に専念する方法を知っている
上記の私のアドバイスに従って、私はPerson
自立するために去ります。Storage
ただし、とのロジックを分離することも、Storage of Person
組み合わせることもできます。
ORM が採用するアプローチは、3 つの概念すべてを分離することです。「オブジェクト リレーショナル マッピング」の「マッピング」は、「人のストレージ」がカプセル化されている場所です。
このアプローチにより、Storage
ストレージ構成の読み取り、ストレージへの接続、ストレージが高速であることの確認、別のストレージ方法の選択など、潜在的に複雑なジョブにロジックを集中させることができます。また、メイン ドメインのモデルへの依存関係が削除されるため、ストレージ コードを他のドメイン モデルで再利用されます。