看到一句英文:ORM变相鼓励你抹去许多对象的相关状态,而Rails则鼓励你耦合任何一切。
原文:
An ORM encourages you to smear related state across a lot of objects, and then Rails encourages you to couple everything else to that.
抹去对象的状态,那么对象的存在意义就没有了,对象的存在价值是状态+守护状态的行为。如:
|
在这个A对象中,A中的状态改变只有必须通过A的行为change去改变,而且输入参数是事件,在change方法中根据业务规则判断输入事件是否允许,如果符合实现设定的规则,那么就允许改变状态,这样做的好处是A的状态改变无法从外部去改变,反之,如果A的状态暴露了(通过字段public或setter方法),如果任何一个新程序员在一个角度直接对A的状态修改,整个状态就可能混乱,状态失去意义,被抹去了。如下面的贫血模型是一种抹去状态的做法:
通过public字段开放:
|
通过setter方法开放:
|
往深处说,前者用对象行为守卫状态的对象模型是一种遵循事物一致性的做法,将一致性划分在一个边界内,比如北京的事情在北京市这个范围内,上海的事情在上海这个范围内。
总结:
1. ORM鼓励你使用贫血模型,贫血模型实际破坏了对象的本身定义,将对象沦为一种数据结构。范了逻辑悖论和偷欢概念的问题
2. Rails鼓励耦合一切,解耦是设计的首要目标,如果一种简单快速的方法却是违反解耦松耦合这个目标的,我们还不如回到delphi时代呢。