私が書いているアプリケーションの設計について助けが必要です。アプリケーションでは、従業員はプロジェクト内で作業を予約できます (いわゆる予約オブジェクト)。予約オブジェクトには、オプションで予算を設定できます。予約オブジェクトの予算が使い果たされた場合、従業員はその予約オブジェクトで予約できてはなりません。
プロジェクト リーダーは、次の 2 つの方法のいずれかで予算額を設定する必要があります。
- 金額を表す 10 進数の設定
- 工数で金額設定
たとえば、予約オブジェクト X の予算は 10,000$ であると言えます。X の予算は、シニア 2.5 人日、ジュニア 3 人日、サポート 5.5 人日で構成されていると言っても過言ではありません。内部的には、工数は金額として計算されます (シニアの価格の 2.5 倍 + ジュニアの価格の 3 倍 + サポートの価格の 5.5 倍)。工数は何らかの計算機ですが、永続化する必要があるため、UI だけではありません。
問題は、工数予算が予約オブジェクトをあまり知らずに、工数予算に価格を注入する方法です。各予約オブジェクトは、レベル (「シニア」、「ジュニア」、「サポート」など) に対して異なる価格を持つことができます。
私は次のクラスを思いつきました。
// could be designed as an interface, too
public abstract class Budget
{
public abstract decimal Amount { get; }
}
金額と工数の 2 つの特別なクラス。
public class MonetaryBudget : Budget
{
private decimal amount;
public MonetaryBudget(decimal amount)
{
this.amount = amount;
}
}
public class ManDayBudget : Budget
{
private decimal amount;
public ManDayBudget(IEnumerable<ManDay> manDays)
{
this.amount = manDays.Sum(md => md.ManDays * PriceOf(md.Level));
}
}
クラスのコンシューマーは、次のように記述できるようになりました。
var bo_x = new BookingObject();
bo_x.Budget = new MonetaryBudget(10000);
bo_x.Budget = new ManDayBudget(new List<ManDay>
{
new ManDay { ManDays = 2.5, Level = "senior" },
new ManDay { ManDays = 3.0, Level = "junior" },
new ManDay { ManDays = 5.5, Level = "support" }
});
var bo_y = new BookingObject();
bo_y.Budget = new ManDayBudget(new List<ManDay>
{
new ManDay { ManDays = 2.5, Level = "senior" },
new ManDay { ManDays = 3.0, Level = "junior" },
new ManDay { ManDays = 5.5, Level = "support" }
});
// bo_x.Budget.Amount == bo_y.Budget.Amount is not guaranteed to evaluate to true
便宜上Budget.Amount
、具象クラスでのプロパティの実装と の定義も公開しましたManDay
。
アプリケーション内の他のオブジェクトにも予算があるという要件があります。それはまだ明確ではありません。ManDayBudget
価格検索ロジックについてあまり知らず、オブジェクトの予約について何も知らないほうがよいように、クラスをどのように設計すればよいでしょうか。計算を行うクラスが欠けているような気がします。
編集:
消費者がすべきこととできることを明確にするために:
var bo_x = new BookingObject();
bo_x.Budget = new ManDayBudget(new List<ManDay>
{
new ManDay { ManDays = 2.5, Level = "senior" },
new ManDay { ManDays = 3.0, Level = "junior" },
new ManDay { ManDays = 5.5, Level = "support" }
});
var bo_y = new BookingObject();
bo_y.Budget = new ManDayBudget(new List<ManDay>
{
new ManDay { ManDays = 2.5, Level = "senior" },
new ManDay { ManDays = 3.0, Level = "junior" },
new ManDay { ManDays = 5.5, Level = "support" }
});
予約オブジェクト X ( ) の金額はbo_x.Budget.Amount
7.600 で、Y の金額は 9.200 です。これは、予約オブジェクトごとに異なる価格が定義されているためです。消費者は、これだけの工数予算を言いますが、それ以上は何も言いません。しかし、後でクラスを再利用するために、BookingObject についてあまり知識がなくても、何らかの方法で金額を計算する必要があります。
編集2:
X はシニアの価格を 100 に、ジュニアの価格を 80 に、などと設定することができ、Y はシニアの価格を 125 に、ジュニアの価格を 100 に設定することができます。日 2 つの予約オブジェクトの金額が異なります。