Demeter的定律是否也适用于标准的ActiveRecord对象方法?

rai*_*400 2 ruby ruby-on-rails law-of-demeter

假设你有一个班级Car,其中有一个班级Driver.如果您想访问驱动程序的年龄,您可以:

@car.driver_age
Run Code Online (Sandbox Code Playgroud)

代替

@car.driver.age
Run Code Online (Sandbox Code Playgroud)

如果您已在Car模型中委派了驱动程序的age属性(前缀设置为true).

但是,如果你还有一个Passenger班级而且你想要获得车内乘客的数量,以下是不违反得墨忒耳法则,或者我的想法过于热心:

@car.passengers.count
Run Code Online (Sandbox Code Playgroud)

Pat*_*ity 5

我认为这count是如此笼统,我不觉得有必要代理电话.我会问自己这个问题:

是否有可能passengers在未来实施,不会回应count

由于passengers极有可能永远是一个容器类型,并且Ruby(Array,Hash...)中的所有容器类型都以count你期望的方式响应,我会用"否"回答这个问题,因此坚持下去@car.passengers.count.

编辑

但如果你是严格的,那你确实违反了得墨忒耳法则.例如RobotCar < Car,考虑一个根本没有乘客的班级.现在,在LoD之后你可以简单地0从方法返回car.passenger_count,而当不跟随LoD时,你将不得不返回一个空容器passengers,以免破坏其他代码.

最后,您必须自己决定接口改变的可能性.如果你非常肯定它不会改变,那么我想可以不服从LoD.