序章
3 つのドメイン オブジェクトがあるとします。
Proposition
Phase
Task
提案は、1 つ以上のフェーズを持つことができます。フェーズには、1 つ以上のタスクを含めることができます。
最後のフェーズの最後のタスクを完了した場合、提案は「クローズ」に設定する必要があります。
コードでは、フェーズの最後のタスクを完了するためにこのようなものを作成しました
//My Business Layer does this:
--------------------------------------
pseudo:
var phase = _phaseRepository.GetById(id);
phase.LastTask.SetComplete();
// My Domain Entities look like this:
------------------------
public class phase()
{
public Task LastTask { get; set; } // not real code of course
}
public class Task()
{
public Phase Phase { get; set; }
public void SetComplete()
{
Phase.IsFinished = true;
}
}
質問
提案を「クローズ」に設定するコードはどこに配置すればよいですか?
オプション
いくつかのオプションがあると思います:
1) ドメイン エンティティ内: Task.SetComplete
public class Task()
{
public Phase Phase { get; set; }
public void SetComplete()
{
Phase.IsFinished = true;
Phase.Proposition.IsClosed = true;
}
}
2a) ビジネス層で
var phase = _phaseRepository.GetById(id);
phase.LastTask.SetComplete();
var proposition = _propositionRepository.GetById(phase.PropositionId);
proposition.IsClosed = true;
2b) ビジネス層では、おそらくもう少し良い方法です:
var phase = _phaseRepository.GetByIdIncludingProposition(id);
phase.LastTask.SetComplete();
phase.proposition.SetClosed();
3) すべてを命題に通す:
//My Business Layer:
var proposition = _propositionRepository.GetById(id);
proposition.CompleteTask(taskId);
// Domain Object:
public class Proposition()
{
public List<Phase> Phases { get; set; }
public void CompleteTask(long taskId)
{
var task = // psuedo: select relevant task from Phases.Tasks, using taskid
task.SetComplete();
task.Phase.SetFinished();
//psuedo: if task.Phase is last phase in proposition
Phase.Proposition.IsClosed = true;
}
}
オプションについて
オプション 1は回線上で問題があります
Phase.Proposition.IsClosed = true;
命題はロードする必要がなく、ロードされていない場合は例外が発生するためです。
オプション 2aには問題があります。これは、phase.LastTask.SetComplete() が実行された後、命題が正しい状態にないためです。そして、フェーズにアクセスできるコード内のどこでも、"phase.LastTask.SetComplete()" は命題に関連する操作を実行せずに実行できます。
オプション 2bには 2a と同じ問題があります。
オプション 3では、命題クラスに過度の責任が与えられます。
何か提案はありますか?