得墨忒尔定律和超宽界面

2021-02-18 21:48

得墨忒尔定律在某些明显的情况下是有意义的更好的步行()# worsedog.腿().front().left().move()狗腿().back().right();任何知识。这更糟吗?打印

解答动态

  • LoD或最小知识原则与不变性无关。它是关于通过减少间接依赖来解耦系统的。
    在dog情况下,您只需要了解dogs就可以进行链式调用。
    在帐户情况下,当某个模块使用帐户时,它还需要了解用户,甚至可能了解地址。所以不仅仅是关于朋友,还有朋友的朋友。这会导致复杂而耗时的更改传播:例如,地址类中的更改可能会影响用户类和帐户类。
    解决方法是告诉对象他们应该做什么,而不必对详细信息:
    account.print();//帐户将调用用户.打印()这当然说起来容易做起来难,因为这可能会造成其他问题(例如,如果需要printSumary()和printDetails(),则接口臃肿)。有时候,你只需要知道更亲密朋友的朋友。最终,设计不是要尊重所有的“法则”,而是要平衡不同的原则以获得最佳的配合。

    • 向接口添加更多的方法并不总是德米特法则的解决方案。你不需要区分这些案例,你需要找到一种不同的方法来解决它们页码:
      另一方面,在类级别,如果LoD没有正确使用,可能会开发出需要引入许多辅助方法的宽接口(即扩大的接口)。这是由于糟糕的设计,而不是LoD本身的结果。如果使用包装器方法,则意味着通过包装器调用的对象应该是调用类中的依赖项示例:
      print(帐户.用户().fullName())打印(帐户.用户().socialSecurityNumber()) 您的呼叫方是否需要与帐户进行交互?删除作为依赖项的帐户并提供用户作为参数改为:
      打印(user().fullname())打印(user().socialSecurityNumber())

      • End

      免责声明:

      本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。