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)
我认为这count是如此笼统,我不觉得有必要代理电话.我会问自己这个问题:
是否有可能
passengers在未来实施,不会回应count?
由于passengers极有可能永远是一个容器类型,并且Ruby(Array,Hash...)中的所有容器类型都以count你期望的方式响应,我会用"否"回答这个问题,因此坚持下去@car.passengers.count.
编辑
但如果你是严格的,那你确实违反了得墨忒耳法则.例如RobotCar < Car,考虑一个根本没有乘客的班级.现在,在LoD之后你可以简单地0从方法返回car.passenger_count,而当不跟随LoD时,你将不得不返回一个空容器passengers,以免破坏其他代码.
最后,您必须自己决定接口改变的可能性.如果你非常肯定它不会改变,那么我想可以不服从LoD.
| 归档时间: |
|
| 查看次数: |
508 次 |
| 最近记录: |