私はビジネスオブジェクトでこのような例をよく見ました:
public void Save()
{
if(this.id > 0)
{
ThingyRepository.UpdateThingy(this);
}
else
{
int id = 0;
ThingyRepository.AddThingy(this, out id);
this.id = id;
}
}
では、なぜここで、ビジネスオブジェクトについてですか?これは、ビジネスロジックよりも、コンテキストまたはデータに関連しているように見えます。
たとえば、このオブジェクトのコンシューマーは、次のようなことを経験する可能性があります...
...Get form values from a web app...
Thingy thingy = Thingy.CreateNew(Form["name"].Value, Form["gadget"].Value, Form["process"].Value);
thingy.Save();
または、更新のためにこのようなもの...
... Get form values from a web app...
Thingy thingy = Thingy.GetThingyByID(Int32.Parse(Form["id"].Value));
Thingy.Name = Form["name"].Value;
Thingy.Save();
では、これはなぜですか?計算やビジネス固有のルールなどの実際のビジネスロジックを含めて、取得/永続化を避けてはどうでしょうか。
このアプローチを使用すると、コードは次のようになります。
... Get form values from a web app...
Thingy thingy = Thingy.CreateNew(Form["name"].Value, Form["gadget"].Value, Form["process"].Value);
ThingyRepository.AddThingy(ref thingy, out id);
または、更新のためにこのようなもの...
... get form values from a web app ...
Thingy thingy = ThingyRepository.GetThingyByID(Int32.Parse(Form["id"].Value));
thingy.Name = Form["Name"].Value;
ThingyRepository.UpdateThingy(ref thingy);
これらの例の両方で、オブジェクトに対して何が行われているのかを最もよく知っているコンシューマーは、リポジトリーを呼び出し、ADDまたはUPDATEのいずれかを要求します。オブジェクトはそのコンテキストではDUMBのままですが、オブジェクトの取得方法や永続化方法ではなく、オブジェクト自体に関連するコアビジネスロジックを提供します。
つまり、GETメソッドとSAVEメソッドをビジネスオブジェクト自体に統合することのメリットはわかりません。
不平を言って従うのをやめるべきですか、それとも何かが足りないのですか?