例如,我有一个名为Car的类,它包含两个类型为AdminPart和PassengerPart的字段。
对于使用我的代码的客户端代码,我希望客户端代码能够car.getLicense()
而不是car.getAdminPart().getLicense()
。这当然是在Car中getLicense()
实现的,而后者又调用了相关的getter。对于二传手也一样。
这是最好的做法吗?我忽略了什么?
答案 0 :(得分:1)
这个问题听起来与Law of Demeter有关(我在你的问题中添加了标签)。这不是一个真正的最佳实践 - 许多人声称它不是真正的“法律”,而是一种启发式(“建议”),它努力减少与信息隐藏相同方向的耦合。我最喜欢的解释是The Paperboy, the Wallet, and the Law of Demeter。
封装表明Car
的客户不应该知道汽车的设计细节。否则,如果您更改这些详细信息,客户端代码可能会中断(您通常希望为客户端提供稳定的API)。如果您允许客户端car.getAdminPart().getLicense()
,您将泄露对象的详细信息,违反信息隐藏和封装原则。
这是一个UML图解释了两种方式: