2013-04-29 55 views
2

假设您有一堂课,Car,它有一个Driver。如果你想访问驾驶员的年龄,你会怎么做:德米特法律是否也适用于标准的ActiveRecord对象方法?

@car.driver_age 

相反

@car.driver.age 

如果您在Car模型委派司机的年龄属性(前缀设置为true)的。

但是,如果你也有一个Passenger类和你想进入车内乘客的数量,是下面没有违反迪米特法则,或者是我的想法过于热心:

@car.passengers.count 
+1

热忱的是术语:) – apneadiving 2013-04-29 12:51:55

+0

LoD不是严格的点数。 – 2013-04-29 13:12:46

回答

5

我认为count是如此的普遍,我不觉得有必要代理这个电话。我会问自己这样一个问题:

是否有可能会有在未来passengers的实现,这将不count回应?

由于passengers极有可能是一个容器类型,直到永远,Ruby中的所有容器类型(ArrayHash,...),以count回应的方式,你会期望,我会回答这个问题与“不”因此坚持与@car.passengers.count

编辑

但是,如果你严格要求,你确实打破迪米特法则。考虑例如根本没有乘客的类RobotCar < Car。现在,继LoD之后,您可以简单地从方法car.passenger_count返回0,而当不遵循LoD时,您将不得不从passengers返回一个空容器,以便不破坏其他代码。最后,你将不得不自己决定接口将会改变的可能性。如果你确信它永远不会改变,那么我认为可以不遵守LoD。

+0

优秀的答案。 – Fuser97381 2015-04-13 13:33:11

+0

但是,一张空的旅客名单可能是合适的,因为机器人汽车可能有乘客。还有另外一个抽象层,例如,它是一种载有乘客并且仅仅是空的汽车*,或者它完全没有座位,这就是'RobotCar'类所暗示的。不知道,我在篱笆上 - 如果您要求机器人汽车的乘客,您仍然想要返回合理的东西或抛出异常,否则您的界面将需要全程进行特殊检查。 – 2015-04-13 14:47:51

1

如果你的类/方法需要知道驾驶员的年龄,它应该有一个直接引用驱动程序:

@driver.age 

或者乘客的数组:

@passengers.count 

通过访问这些@car做出了许多假设。想象一下没有司机或没有乘客的玩具车的自动汽车。 @car.driver_age@car.passengers_count没有多大意义。

+0

meh,'driver_age'将为零,'passengers_count'将始终为零。 – kch 2013-04-29 13:44:26

+2

@kch我不希望汽车首先知道司机的年龄。 – Stefan 2013-04-29 13:59:35

+0

公平。 (亲爱的SO,这是我评论的全部内容,感谢你的努力。) – kch 2013-04-29 14:03:18

1

LoD不仅仅是“计算点”,并且交易点的下划线没有帮助。

汽车必须有一个时代的驱动器;对此没有任何不合理之处。

(嗯,不是真的,因为我们即将进入无人驾驶汽车的年龄,这个模型可能不能说明的是,但​​那是另外一个问题。)

得墨忒耳的功能法要求对象O的方法M可以仅调用以下类型的对象的方法:

  1. ö本身
  2. M的参数在M中
  3. 任何对象创建/实例化
  4. O公司直接分量对象

特别地,一个目的应该避免调用由另一个方法返回的成员对象的 方法。

+0

赞赏downvotes的意见。我没有发现有什么过错,并且其索赔得到了支持。 – 2015-04-13 14:38:16

相关问题