背景:
我正在建立一个系统,根据学生的属性和顾问的接受度为大学生分配学术顾问。现在,我想在开始处理学生并对我们的 CRM 和 Active Directory 进行更改之前检查是否可以为每个可能的学生分配顾问。大约有 15,000 条记录,所以我不想提交更改,除非所有学生都有顾问。
我当前的系统有一个“AdvisorGroup”对象来保存“AdvisorRules”列表。我的“AdvisorRules”对象是从 CRM 填充的:
class AdvisorRule
{
public AdvisorCondition Condition { get; set; }
public AdvisorField Field { get; set; }
public String Value { get; set; }
}
AdvisorCondition
可以是 LessThanEqual、GreaterThanEqual 或 Equal。AdivsorField
可以是学分(每个顾问将接受多少学分)、国际(如果顾问接受有意的学生)、荣誉(如果顾问是否接受荣誉学生)和姓氏(顾问将接受的姓氏。)
“Value”是与“AdvisorField”进行比较的目标。例如,AdvisorGroup 中的 AdvisorRules 列表可以包含以下规则:
- AdvisorCondition = "Equal" AdvisorField = "International" Value = No
- AdvisorCondition = "Equal" AdvisorField = "honors" Value = No
- AdvisorCondition = "LessThanEqual" AdvisorField = "Credit" Value = 89
- AdvisorCondition = "Equal" AdvisorField = "LastName" Value = A
- AdvisorCondition = "Equal" AdvisorField = "LastName" Value = B
该顾问将接受姓氏以 A 或 B 开头、少于 89 个学分且不是国际学生或荣誉学生的学生。
问题:
有没有办法检查以确保在我开始处理之前为每个可能的学生分配顾问?我试图在我的编码中不要过于明确。我在想这样的事情,但如果我能找到更好的方法,我愿意重新设计:
private bool checkRuleCoverage()
{
//somehow generate list of possible scenarios here
foreach (possible scenario in list of possible scenarios)
{
bool covered = isCovered(possible scenario);
if(!covered) {throw error and return}
}
}
private bool isCovered(List<AdvisorGroup> adGroups, possibleScenario ps)
{
foreach (AdvisorGroup advisor in adGroups)
{
foreach (AdvisorRule rule in advisor.rules)
{
if(advisor.rules == ps)
return true;
}
}
return false;
}