バックグラウンド:
学生の属性と指導教員の受け入れ状況に基づいて、大学生に指導教員を割り当てるシステムを構築しています。ここで、学生の処理と CRM および Active Directory への変更のコミットを開始する前に、考えられるすべての学生にアドバイザーを割り当てることができるかどうかを確認したいと考えています。約 15,000 件のレコードがあるため、すべての学生にアドバイザーがいない限り、変更をコミットしたくありません。
現在のシステムには、「AdvisorRules」のリストを保持する「AdvisorGroup」オブジェクトがあります。「AdvisorRules」オブジェクトは CRM から取り込まれます。
class AdvisorRule
{
public AdvisorCondition Condition { get; set; }
public AdvisorField Field { get; set; }
public String Value { get; set; }
}
AdvisorCondition
LessThanEqual、GreaterThanEqual、または Equal のいずれかです。AdivsorField
Credit (各アドバイザーが受け入れるクレジット数)、international (アドバイザーが意図的な学生を受け入れる場合)、honors (アドバイザーが優等生を受け入れるかどうか)、および lastName (アドバイザーが受け入れる姓) を指定できます。
「Value」は、「AdvisorField」と比較されるターゲットです。たとえば、AdvisorGroup 内の AdvisorRules のリストは、次のルールを保持できます。
- AdvisorCondition = "等しい" AdvisorField = "インターナショナル" 値 = いいえ
- AdvisorCondition = "Equal" AdvisorField = "honors" 値 = いいえ
- AdvisorCondition = "LessThanEqual" AdvisorField = "Credit" 値 = 89
- AdvisorCondition = "Equal" AdvisorField = "LastName" 値 = A
- AdvisorCondition = "Equal" AdvisorField = "LastName" 値 = 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;
}