ORM和Rails的問題

banq發表於2014-08-23

看到一句英文: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.

抹去物件的狀態,那麼物件的存在意義就沒有了,物件的存在價值是狀態+守護狀態的行為。如:

public class A{
   private int state;

   public void change(Event e){
          ....      
       
        this state = xxx;  //根據輸入事件改變狀態
         ......     
   }

}
<p>

在這個A物件中,A中的狀態改變只有必須通過A的行為change去改變,而且輸入引數是事件,在change方法中根據業務規則判斷輸入事件是否允許,如果符合實現設定的規則,那麼就允許改變狀態,這樣做的好處是A的狀態改變無法從外部去改變,反之,如果A的狀態暴露了(通過欄位public或setter方法),如果任何一個新程式設計師在一個角度直接對A的狀態修改,整個狀態就可能混亂,狀態失去意義,被抹去了。如下面的貧血模型是一種抹去狀態的做法:

通過public欄位開放:

public class A{
   public int state;//public暴露給外界直接修改
  ....  
}
<p>

通過setter方法開放:

public class A{
   private int state;

   public void setState(int newstate){
        this state = newstate;  //被外界直接修改
   }
}
<p>

往深處說,前者用物件行為守衛狀態的物件模型是一種遵循事物一致性的做法,將一致性劃分在一個邊界內,比如北京的事情在北京市這個範圍內,上海的事情在上海這個範圍內。

總結:

1. ORM鼓勵你使用貧血模型,貧血模型實際破壞了物件的本身定義,將物件淪為一種資料結構。範了邏輯悖論和偷歡概念的問題

2. Rails鼓勵耦合一切,解耦是設計的首要目標,如果一種簡單快速的方法卻是違反解耦鬆耦合這個目標的,我們還不如回到delphi時代呢。

以上觀點只代表一種看法。更多參考:

領域模型行為設計

足球案例

[該貼被banq於2014-08-23 09:56修改過]

相關文章