ORM和Rails的問題
看到一句英文: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修改過]
相關文章
- 安裝rails遇到的問題AI
- 部署rails遇到問題AI
- beego orm中時區的問題GoORM
- 關於Beego ORM和 request body 的對映問題GoORM
- Rails 3 升級 Rails 4 中遇到的問題及解決方法AI
- laravel orm 關聯問題LaravelORM
- orm.Fielder介面問題ORM
- beego orm join 聯合查詢的問題GoORM
- Ruby On Rails實踐—中文亂碼問題AI
- 辛星淺析windows下搭建rails框架的sqlite的一個問題WindowsAI框架SQLite
- 記SqlSugar ORM框架之找不到主鍵問題SqlSugarORM框架
- java 和 Ruby On Rails的對比JavaAI
- Django ORM 引發的資料庫 N+1 效能問題DjangoORM資料庫
- SQLAlchemy 和其他的 ORM 框架SQLORM框架
- ruby on rails筆記和理解AI筆記
- 精簡版的Rails框架->Rails::APIAI框架API
- 關於rails和Grails的效能討論AI
- .NET ORM 導航屬性【到底】可以解決什麼問題?ORM
- Ruby on Rails 生成指定版本的 Rails 專案AI
- Rails的模板AI
- JBoss和WebService的問題Web
- 解決問題的方法和途徑-問題管理
- 混合ORM 和MongoDB使用案例ORMMongoDB
- delphi ORM和泛型模板ORM泛型
- rails graphql的使用AI
- Struts Tiles 和 session的問題Session
- CentOs 6下配置帶Apache和Passenger的Rails 4CentOSApacheAI
- [Rails學習之路]Rails路由配置AI路由
- SQL優化--not in和or出的問題SQL優化
- new和malloc的地址分配問題
- SQL SERVER和ORACLE的排序問題SQLServerOracle排序
- 排查問題的思路和清單
- maven的編碼問題、解決和疑問Maven
- 求助: Socket的InputStream和OutputStream的問題
- 域名訪問和ip訪問引起的http 403問題HTTP
- Rails中的Helper方法AI
- 定位和居中問題
- 子段和問題