2011-06-21 59 views
13

因此,我完成了我正在構建的Web應用程序的OO分析和設計,現在正在實施。設計決定已經實現了使用Python和Web開發框架Django來實現系統。從Django模型類中解耦Domain類

我想開始實現一些需要持久性的域實體類。看來Django會讓我將它們實現爲從Django模型類繼承的類,以便使用Django ORM進行持久化。然而,這似乎是我的類實體和持久性機制之間的耦合太強。如果在某個階段我想要拋棄Django並使用其他Web開發框架,或者只是將Django的ORM替換爲另一個選項,會發生什麼?現在我必須從頭開始重寫我的域實體類。

因此,最好將我的域類作爲獨立的Python類實現,將我所有的業務邏輯封裝在這些類中,然後使用一些機制(設計模式,如橋或適配器或???)來委託持久性存儲這些領域類到Django ORM,例如通過一個Django模型類,它已經被適當地設置了。

有沒有人有關於如何去做這件事的建議?從我所讀到的看來,人們只是簡單地將它們的領域類實現爲繼承自Django模型類的類,並且在這個類中混合了業務邏輯。這似乎不是一個好主意,用於下線更改,維護,可重用等。

回答

3

好吧,Django的使用方式是從Django的基本模型類繼承。這是'積極的記錄'模式。您的django模型將擁有所有的CRUD和查詢方法以及您的業務邏輯(如果您決定添加它)。這在Java世界中被看作是一種反模式,但它的酷炫之處在於它可以加快開發速度。

4

你能認真設想你可能會只是溝渠Django ORM,但保留一切嗎?或者,如果你完全拋棄了Django,你的代碼的任何仍然適用?

你不會抱怨,如果你放棄了Django,你將不得不重寫所有的模板。當然你會的,這是可以預料的。那麼爲什麼表示層與框架綁定,而不是持久層呢?

這種前期過度分析需要避免。 Django是一個RAD工具,最適合快速迭代開發。儘管如此,許多大公司都會作證,所以它能夠建立一些強大的,長期的應用程序。但它不是Java,它不是「企業級」,它不符合面向對象的原則。在Python世界中,這被看作是一個功能,而不是一個bug。

+1

如果你解釋爲什麼這是一個功能而不是一個錯誤,這將是一個更好的答案。我喜歡Python,但是Django將不同概念混合在一起並不總是一個勝利。 – AdamC

0

如果您需要不同的持久性機制,則不必「從頭開始重新編寫模型」。 activerecord風格的持久性系統的重點在於它對模型類施加最小的約束,並且在很大程度上透明。

如果你真的擔心,將任何依賴於查詢的代碼抽象到他們自己的方法中。

-1

我認爲沒有實現解耦Django模型和域類的解決方案,至少我沒有找到任何解決方案。事實上,我所知道的唯一具有這種解耦的ORM僅存在於Smalltalk世界中,它被稱爲GLORP。它允許您將關係數據庫中的域模型保留,而無需修改域類。我目前正試圖實現類似的想法來從Django ORM中分離出來。我的動機是目前數據庫表和域類之間的強大耦合嚴重損害了軟件的演變。如果我成功,我會再次發帖:)