我和一位同事为我们的客户设计了一个系统,我们认为我们创建了一个漂亮简洁的设计。但我对我们引入的一些耦合遇到了问题。我可以尝试创建一个示例设计,其中包含与我们的设计相同的问题,但如果您原谅我,我将创建我们设计的摘录来支持该问题。
我们正在开发一个用于注册患者某些治疗的系统。为了避免图像链接断开,我将概念性 UML 类图描述为 C# 样式类定义。
class Discipline {}
class ProtocolKind
{
Discipline;
}
class Protocol
{
ProtocolKind;
ProtocolMedication; //1..*
}
class ProtocolMedication
{
Medicine;
}
class Medicine
{
AdministrationRoute;
}
class AdministrationRoute {}
我将尝试解释一些有关设计的内容,协议是新治疗的模板。方案是某种类型的并且包含需要施用的药物。根据协议,同一种药物(除其他外)的剂量可能有所不同,因此存储在 ProtocolMeduction 类中。 AdministrationRoute 是与方案管理分开的药物施用和创建/更新的方式。
我发现以下地方违反了德墨忒尔法则:
违反德墨忒尔法则
球内部
例如,在协议药物的业务逻辑内部,存在依赖于药物的管理路线.可溶性属性的规则。代码将变成
if (!Medicine.AdministrationRoute.Soluble)
{
//validate constrains on fields
}
存储库内部
列出某个学科中所有协议的方法将写为:
public IQueryable<Protocol> ListQueryable(Discipline discipline)
{
return ListQueryable().Where(p => (p.Kind.Discipline.Id == discipline.Id)); // Entity Frameworks needs you to compare the Id...
}
用户界面内部
我们使用 ASP.NET(无 MVC)作为我们系统的接口,在我看来,这一层目前存在最严重的违规行为。 gridview的数据绑定(必须显示协议Discipline的列必须绑定到Kind.Discipline.Name),它们是字符串,所以没有编译时错误.
<asp:TemplateField HeaderText="Discipline" SortExpression="Kind.Discipline.Name">
<ItemTemplate>
<%# Eval("Kind.Discipline.Name")%>
</ItemTemplate>
</asp:TemplateField>
所以我认为真正的问题可能是,什么时候可以将其更多地视为德墨忒尔的建议,以及可以采取什么措施来解决违反德墨忒尔定律的问题?
我对自己有一些想法,但我会将它们作为答案发布,以便可以单独评论和投票。 (我不确定这是这样做的方式,如果不是,我会删除我的答案并将它们添加到问题中)。