DDDの主な点は、ドメインに焦点を当てることです。その理由は、ドメインと呼ばれる理由です。ドリブンデザイン。
ドメイン、ドメインを構成するものを詳しく調べることなく、関係、集約、およびエンティティについて尋ねると、実際にはドメインではなくデータベースモデリングが求められます。
私はあなたが間違った質問をしていると言っているわけでもなく、批判しているわけでもありません。勉強中に実際に試してみると間違っていないと思います。
私はDDDの専門家ではありません。私はあなたのように学んでいますが、私は助けようとします。
どのような状況が発生する可能性があると考え始めます。Holydays Management。さまざまなルールがある場合は、の戦略(私は最終的な解決策です)を使用して開始することができます。
素敵で意味のあるドメインを構築することは、少なくとも私にとっては難しいことです。あなたはコードを書く。試して。洞察力を持ち、コードを投げて書き直してください。それをリファクタリングしてください。ソフトウェアのライフサイクルでは、ドメインに焦点を当てる必要があるため、常に改善する必要があります。
(ドメインの下書きのように)コーディングを開始して、どのように見えるかを確認します。それを試してみましょう。まず、なぜこのようなものを管理する必要があるのでしょうか?どんな問題を解決しようとしていますか?ああ、時には従業員が休みを求める時、私たちはそれをコントロールしたい。我々は、彼らが「ホリデイ」を望む理由と、どのようにチームのステータスになっているかによって、承認するかどうかを決めるかもしれない。私たちが辞退し、彼らがまだ家に帰ると、私たちは火事か割引かを決定するでしょう。
ここ
public interface IHolydayStrategy
{
bool CanTakeDaysOff(HolydayRequest request);
}
public class TakeCareOfChildren : IHolydayStrategy
{
public bool CanTakeDaysOff(HolydayRequest request)
{
return IsTotalDaysRequestedUnderLimit(request.Range.TotalDays());
}
public bool IsTotalDaysRequestedUnderLimit(int totalDays)
{
return totalDays < 3;
}
}
public class InjuredEmployee : IHolydayStrategy
{
public bool CanTakeDaysOff(HolydayRequest request)
{
return true;
}
}
public class NeedsToRelax : IHolydayStrategy
{
public bool CanTakeDaysOff(HolydayRequest request)
{
return IsCurrentPercentageOfWorkingEmployeesAcceptable(request.TeamRealSize, request.WorkingEmployees)
|| AreProjectsWithinDeadline(request.Projects);
}
private bool AreProjectsWithinDeadline(IEnumerable<Project> projects)
{
return !projects.Any(p => p.IsDeadlineExceeded());
}
private bool IsCurrentPercentageOfWorkingEmployeesAcceptable(int teamRealSize, int workingEmployees)
{
return workingEmployees/teamRealSize > 0.7d;
}
}
public class Project
{
public bool IsDeadlineExceeded()
{
throw new NotImplementedException();
}
}
public class DateRange
{
public DateTime Start { get; set; }
public DateTime End { get; set; }
public int TotalDays()
{
return End.Subtract(Start).Days;
}
public bool IsBetween(DateTime date)
{
return date > Start && date < End;
}
}
public enum HolydayTypes
{
TakeCareOfChildren,
NeedToRelax,
BankOfHours,
Injured,
NeedToVisitDoctor,
WannaVisitDisney
}
public class HolydayRequest
{
public IEnumerable<Project> Projects { get; internal set; }
public DateRange Range { get; set; }
public HolydayTypes Reason { get; set; }
public int TeamRealSize { get; internal set; }
public int WorkingEmployees { get; internal set; }
}
が、私はすぐにこれを書いた方法です:ユビキタス言語を強制することは、のコードでこの問題を表現してみましょう
- Holydaysが付与されたかどうか、状況や 理由に応じて、のは作成してみましょうすることができます
IHolydayStrategy
。
- 空白(プロパティなし)
HolydayRequest
クラスが作成されました。
- 考えられる理由ごとに、異なる戦略を作成しましょう。
- 子供の世話をする理由がある場合は、 の合計リクエストが制限を下回っていると、休みになることがあります。
- 理由は、従業員が負傷したためです。要求を許可する以外に、 という選択肢がありません。
- リラックスしなければならない理由がある場合は、 の従業員の受け入れ可能なパーセンテージか、プロジェクトが 期限内にあるかどうかを確認します。
- 戦略のデータが必要になるとすぐに、私は
CTRL + .
から までをHolydayRequest
に自動的に作成しました。
これらのものがどのように格納/マップされるのかわからないのを見てください。私はちょうど問題を解決するコードを書いて、それを解決するために必要な情報を得ました。
明らかに、これは最終的なドメインではなく、単なる草稿です。私はこのコードを取り除き、必要であれば、まだそれのための気持ちを書き直すことはできません。
人々はそれだけで常にtrueを返すためにInjuredEmployee
クラスを作成するために役に立たないと思うかもしれませんが、ここでのポイントは、可能な限り明示ようなものを作るために、ユビキタス言語を利用することで、誰もが同じことを読み、理解するであろう: "怪我をした従業員がいる場合、チームの状況や必要な日数に関係なく、いつでも休暇を取ることができます。"。 DDDのこのコンセプトの問題の1つは、開発者、プロダクトオーナー、ドメインエキスパート、その他の参加者の間での用語やルールの誤解です。
この後、モックデータでいくつかのテストを書くことになります。私はコードをリファクタリングするかもしれない。
この "3":
public bool IsTotalDaysRequestedUnderLimit(int totalDays)
{
return totalDays < 3;
}
と、この "0.7D":
private bool IsCurrentPercentageOfWorkingEmployeesAcceptable(int teamRealSize, int workingEmployees)
{
return workingEmployees/teamRealSize > 0.7d;
}
は戦略に存在すべきでない、私の視点では、仕様です。物事を切り離すために、仕様書を適用することがあります。
合格したテストで合理的な初期の解決策を得たら、それをどのように保存すべきか考えてみましょう。ここでは、最終的に定義されたクラス(Team、Project、Employeeなど)をORMによってマップすることがあります。
あなたのエンティティの間にはの関係が生じるので、私は通常、ORMが自分のドメインをどのように保持するのか、この時点で集計は何か気にしません。
非常に重要だとはいえ、私はEmployeeクラスをまだ作成していないことを見てください。そのため、エンティティとそのプロパティを作成することで開始するべきではありません。なぜなら、テーブルとフィールドを作成することとまったく同じですからです。
あなたのDDDはになります。Database Driven Designそうですね、私たちはこれを望ましくありません。もちろん、最終的には従業員を作るつもりですが、必要なときに作成してみましょう。一度にすべてのモデリングを開始しないで、必要なすべてのエンティティを予測してください。あなたの問題に焦点を当て、それを解決する方法。
あなたの質問については、エンティティとは何ですか、私はあなたがそれらの定義を要求していないと思うが、従業員はあなたのドメインを考慮して、ドメインがコードによって明らかにされるとすぐに、あなたは最終的に自分自身に答えるでしょう。 Application Laye rの開発を開始したときには、データを読み込んで自分のドメインに委任する必要があります。私のドメインロジックが期待するデータ、どこからクエリを開始するのか。
私は誰かを助けたと思います。
従業員のチームは休日の要求にどのように関連していますか?ここで保護する不変量は何ですか?たとえば、同じチームの他の従業員が重複する休暇を要求した場合、従業員は休暇を要求できますか?あなたは保護しようとしている不変量を知らなくても、適切なAR境界を定義することはできません。 – plalx
@plalx境界線がないとしましょう。ある日に誰も働いていない日があるとしましょう。別のシナリオ:少なくとも1人のチームのメンバーが働いていなければならず、他のメンバーは甘い休暇を取るとします。私が知る必要があるのは、これらの関係をモデル化する方法だけです。従業員が休息を取ることができない場合は、何らかのイベントの再発可能性がありますか?一方、そのような要求をしている従業員は、その日に従業員が誰も利用できないため、休暇申請を送信できないことを知る必要があります。どう思いますか? –
@plalx私の答えを完成させるために、従業員は送信された休暇申請の作者であるため、それを受け入れる許可を得ようとしている他の「従業員」は誰がそれを送ったかを知っています。ですから、基本的に 'HolidaysRequest'はHolidaysRequestMetadataと' Employee'で構成されています。 –