我需要帮助设计我正在编写的应用程序。在应用程序中,员工可以在项目中预订他们的工作(所谓的预订对象)。预订对象可以有选择地具有预算。当预订对象的预算用尽时,员工不得在该预订对象上进行预订。
项目负责人应通过以下两种方式之一设置预算金额:
- 设置一个十进制数,代表一些货币金额
- 通过人工天数设置金额
例如,可以合法地说预订对象 X 的预算为 10,000 美元。同样合法的是,X 的预算包括高级人员 2.5 人日、初级人员 3 人日和支持人员 5.5 人日。在内部,人日金额计算为货币金额(高级价格的 2.5 倍 + 初级价格的 3 倍 + 支持价格的 5.5 倍)。man-day 金额在某种程度上是一个计算器,但它应该被持久化,所以不仅仅是 UI 的东西。
问题是如何在工日预算不了解预订对象太多的情况下将价格注入工日预算。每个预订对象的级别(“高级”、“初级”、“支持”等)允许有不同的价格。
我想出了以下课程。
// could be designed as an interface, too
public abstract class Budget
{
public abstract decimal Amount { get; }
}
货币金额和人日金额的两个特殊类别。
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 等。因此,即使人工天数也设置为相同的数量天两个预订对象的金额不同。