假设您有一堂课,Car
,它有一个Driver
。如果你想访问驾驶员的年龄,你会怎么做:德米特法律是否也适用于标准的ActiveRecord对象方法?
@car.driver_age
相反
@car.driver.age
如果您在Car
模型委派司机的年龄属性(前缀设置为true)的。
但是,如果你也有一个Passenger
类和你想进入车内乘客的数量,是下面没有违反迪米特法则,或者是我的想法过于热心:
@car.passengers.count
假设您有一堂课,Car
,它有一个Driver
。如果你想访问驾驶员的年龄,你会怎么做:德米特法律是否也适用于标准的ActiveRecord对象方法?
@car.driver_age
相反
@car.driver.age
如果您在Car
模型委派司机的年龄属性(前缀设置为true)的。
但是,如果你也有一个Passenger
类和你想进入车内乘客的数量,是下面没有违反迪米特法则,或者是我的想法过于热心:
@car.passengers.count
我认为count
是如此的普遍,我不觉得有必要代理这个电话。我会问自己这样一个问题:
是否有可能会有在未来
passengers
的实现,这将不count
回应?
由于passengers
极有可能是一个容器类型,直到永远,Ruby中的所有容器类型(Array
,Hash
,...),以count
回应的方式,你会期望,我会回答这个问题与“不”因此坚持与@car.passengers.count
。
编辑
但是,如果你严格要求,你确实打破迪米特法则。考虑例如根本没有乘客的类RobotCar < Car
。现在,继LoD之后,您可以简单地从方法car.passenger_count
返回0
,而当不遵循LoD时,您将不得不从passengers
返回一个空容器,以便不破坏其他代码。最后,你将不得不自己决定接口将会改变的可能性。如果你确信它永远不会改变,那么我认为可以不遵守LoD。
优秀的答案。 – Fuser97381 2015-04-13 13:33:11
但是,一张空的旅客名单可能是合适的,因为机器人汽车可能有乘客。还有另外一个抽象层,例如,它是一种载有乘客并且仅仅是空的汽车*,或者它完全没有座位,这就是'RobotCar'类所暗示的。不知道,我在篱笆上 - 如果您要求机器人汽车的乘客,您仍然想要返回合理的东西或抛出异常,否则您的界面将需要全程进行特殊检查。 – 2015-04-13 14:47:51
如果你的类/方法需要知道驾驶员的年龄,它应该有一个直接引用驱动程序:
@driver.age
或者乘客的数组:
@passengers.count
通过访问这些@car
做出了许多假设。想象一下没有司机或没有乘客的玩具车的自动汽车。 @car.driver_age
或@car.passengers_count
没有多大意义。
LoD不仅仅是“计算点”,并且交易点的下划线没有帮助。
汽车必须有一个时代的驱动器;对此没有任何不合理之处。
(嗯,不是真的,因为我们即将进入无人驾驶汽车的年龄,这个模型可能不能说明的是,但那是另外一个问题。)
得墨忒耳的功能法要求对象O的方法M可以仅调用以下类型的对象的方法:
- ö本身
- M的参数在M中
- 任何对象创建/实例化
- O公司直接分量对象
特别地,一个目的应该避免调用由另一个方法返回的成员对象的 方法。
赞赏downvotes的意见。我没有发现有什么过错,并且其索赔得到了支持。 – 2015-04-13 14:38:16
热忱的是术语:) – apneadiving 2013-04-29 12:51:55
LoD不是严格的点数。 – 2013-04-29 13:12:46