在敏捷开发人员的基本技能中,在需求与能力接口中,第 12 章,我试图理解作者在本章末尾提到的应用分度法则的挑战所提出的主要解决方案。
为了使故事简短。
我们从以下研究案例开始:
public class City {
public string name{};
public City twinCity{};
public Street[] streets{};
}
public class Street {
public string name{};
public House[] houses{};
}
public class House {
public int number{};
public Color color{};
}
作者声明:
像这样的模型鼓励我们公开而不是封装。如果你的代码引用了一个特定的 City 实例,比如一个映射西雅图的实例,并且你想要 1374 Main Street 的房子的颜色,那么你可能会执行以下操作:
public Foo() {
Color c = Seattle.streets()["Main"].
houses()[1374].
color();
}
如果将其作为一般做法进行,问题在于系统会在任何地方产生依赖关系,并且对该模型的任何部分的更改都会对这些依赖关系链的上下产生影响。这就是得墨忒耳法则的用武之地,它规定2“不要和陌生人说话”。这在对象系统中被形式化为函数/方法的得墨忒耳法则。对象 O 的方法 M 只能调用以下几种对象的方法:
- 奥氏
- M的参数
- 在 M 中实例化的任何对象
- O 的直接组件对象
- O 可访问的任何全局变量
并建议在应用 DEMTER 法则时,我们应该瞄准类似的东西
public Foo() {
Color c = Seattle.ColorOfHouseInStreet("Main",1374);
}
并迅速从以下方面发出警告:
尽管最初这似乎是一个明智的策略,但它很快就会失控,因为任何给定实体的接口都可以预期提供与其相关的任何内容。这些接口往往会随着时间的推移而膨胀,事实上,给定 Glass 最终可能支持的公共方法的数量似乎几乎没有尽头。
然后在解释了耦合和依赖的问题后,他提到了通过服务的接口分离客户端及其服务的重要性,并且可能进一步将客户端的“需要接口”与“服务能力”分离接口”通过使用适配器作为理想但不一定实用的东西;
他建议,为了解决这个问题,我们可以结合 DEMETER 法则和需求/能力分离,使用外观模式,如下所述:
从原始依赖
在应用 demeter 定律和需求/能力接口分离时,我们最初应该得到:
但是考虑到它是不切实际的,特别是从模拟的角度来看,我们可以用下面的外观来做一些更简单的事情:
问题是我只是不明白这究竟是如何解决不违反得墨忒耳法则的问题。我认为它维护了原始客户和原始服务之间的法律。但它只是在 FACADE 内移动了违规行为。