我以前问过这关于代码评审的问题,但是有人告诉我这是“非主题”,所以我在这里尝试。我希望有人能帮我指路。
作为我们建立的保险索赔系统的一部分,索赔管理人员可以记录与索赔有关的来电。
索赔管理器必须通过询问许多“数据保护”问题来验证调用方,这些问题是根据数据库中针对索赔的信息动态生成的。我相信这种类型的安全性被称为“基于知识的身份验证”。
当前的系统是五年前编写的,我们没有尝试使用任何设计模式或现代方法(比如领域驱动的设计),因为我们缺乏时间和理解。
我们现在有机会重写这个软件,并希望遵循域驱动的方法。
下面是我对上述需求建模的简单尝试:
public class DataProtection
{
public IEnumerable<DataProtectionQuestion> DataProtectionQuestions { get; set; }
public bool DataProtectionValidated =>
DataProtectionQuestions.Where(x => x.IsRequired).All(x => x.AnswerIsCorrect) &&
DataProtectionQuestions.Any(x => x.IsRequired == false && x.AnswerIsCorrect);
}
public class DataProtectionQuestion
{
public IEnumerable<string> Answers { get; set; }
public string Question { get; set; }
public bool IsRequired { get; set; }
public string Answer { get; set; }
public bool AnswerIsCorrect => Answers?.Contains(Answer) ?? false;
}这一设计产生的问题:
有谁能就前进的方向/更好的方法提供一些指导/建议?
发布于 2019-04-03 09:59:17
根据鲍勃叔叔的说法,这些实体会被认为是贫血吗?
难道不是马丁·福勒创造了“贫血”这个词吗?无论如何,我会说“不”,他会认为DataProtectionQuestion是一个数据结构,而不是一个对象。MF可能不同意。
DataProtection实体是验证答案的“正确”位置吗?
很难说。我不喜欢你的例子对象。我可以看到,对已回答的问题的评估可能比简单的函数更复杂,因此您希望能够替换业务规则。我会有这样的东西:
public class DataProtectionForSituationX : IResultEvaluator
{
public bool DataProtectionValidated(IEnumerable<DataProtectionQuestion> answeredQuestions) {...}
}答案是否应该是具有“IsValid”属性的实体?
是。您将希望存储、传递和使用答案,而不必担心它们是否有效,它们的验证很可能取决于答案之外的信息以及时间信息。
https://softwareengineering.stackexchange.com/questions/389683
复制相似问题