我和一位同事为我们的客户设计了一个系统,我们认为我们创造了一个很好的干净设计。但是我在我们引入的一些耦合方面遇到了问题。我可以尝试创建一个示例设计,其中包含与我们的设计相同的问题,但如果您原谅我,我将创建我们设计的摘录来支持这个问题。
我们正在开发一个系统,用于为患者注册某些治疗。为了避免到图像的链接断开,我将把 UML 概念类图描述为 ac# 样式类定义。
class Discipline {}
class ProtocolKind
{
Discipline;
}
class Protocol
{
ProtocolKind;
ProtocolMedication; //1..*
}
class ProtocolMedication
{
Medicine;
}
class Medicine
{
AdministrationRoute;
}
class AdministrationRoute {}
我将尝试解释一下设计,协议是新治疗的模板。并且协议属于某种类型并且具有需要管理的药物。根据协议,相同药物的剂量可能不同(除其他外),因此存储在 ProtocolMedication 类中。AdministrationRoute 是与协议管理分开管理和创建/更新药物的方式。
我发现以下我们将违反德墨忒耳法则的地方:
违反得墨忒耳法则
BLL 内部
例如,在 ProtocolMedication 的业务逻辑中,有一些规则依赖于药物的 AdministrationRoute.Soluble 属性。代码将变为
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 的数据绑定(必须显示协议纪律的列必须绑定到 Kind.Discipline.Name),它们是字符串,所以没有编译时错误。
<asp:TemplateField HeaderText="Discipline" SortExpression="Kind.Discipline.Name">
<ItemTemplate>
<%# Eval("Kind.Discipline.Name")%>
</ItemTemplate>
</asp:TemplateField>
所以我认为实际的问题可能是,什么时候可以将其更多地视为德墨忒耳的建议,以及如何解决违反德墨忒耳法则的行为?
我对自己有一些想法,但我会将它们作为答案发布,以便可以单独对其进行评论和投票。(我不确定这是这样做的方式,如果不是,我将删除我的答案并将它们添加到问题中)。