假设,我们有以下Boy
类,它试图Girl
通过分析她的日程安排来安排日期(Java 中的示例):
public class Boy {
public boolean tryArrangeDate(Girl girl, Date time) {
boolean success = true;
for (GirlRoutine routine : girl.getSchedule()) {
if (routine.happensAt(time)) {
success = false;
break;
}
}
return success;
}
}
Boy.tryArrangeDate()
由于routine.happensAt()
调用,该方法显然违反了得墨忒耳法则。解决此问题的方法之一是将进度分析直接Girl
移至GirlRoutine
. 在这种情况下,这可能是最好的决定之一。类的 RFCBoy
将减少。
但是假设我们选择不同的方向来解决违反德墨忒耳法则的问题,并以这种方式更改代码:
public class Boy {
public boolean tryArrangeDate(Girl girl, Date time) {
return isFree(girl.getSchedule(), time);
}
private boolean isFree(List<GirlRoutine> schedule, Date time) {
boolean free = true;
for (GirlRoutine routine : schedule) {
if (happensAt(routine, time)) {
free = false;
break;
}
}
return free;
}
private boolean happensAt(GirlRoutine routine, Date time) {
return routine.happensAt(time);
}
}
添加了两个私有方法,它们只是将调用委托给Girl
她的日程安排/例程。
每个单独采用的方法似乎都没有违反得墨忒耳法则(为了简单起见,让我们将从集合中检索项目视为原始的无方法调用操作)。但总的来说,我们并没有减少这个类的 RFC,也没有提高内聚性,实际上增加了 WMC。告诉,不问原则是不保留的。所以,得墨忒耳法则满足了,但设计仍然不稳定。
问题:( 正式)第二个代码片段确实不违反得墨忒耳定律吗?
注意:问题的目的不是寻找替代解决方案,而是确认/反驳该解决方案符合得墨忒耳定律