簡體   English   中英

Grails:當我不想保存任何內容時,我可以使用域對象嗎?

[英]Grails: Can I use domain objects when I don't want to save anything?

我的一些域類變得相當豐富:它們實現了一個有趣的可比較,可能有加號,減號,乘法和div,許多都有一些方便的getter來調用服務並確定復雜的東西。 最重要的是,他們擁有合適的屬性。 我正在將這兩者用於正常的“數據庫事務”,並且在我只想要一個具有所有這些方法但可能不想保存它的對象的時候。

我的隊友確信這非常糟糕,並建議我應該使用DTO(數據傳輸對象),據我所知,這將是一個POGO / POJO,其中一個域類'代碼復制/粘貼。這似乎真的不干,我看不出有什么好處。 將域對象不時用作常規對象有什么問題嗎? 我錯過了DTO的觀點嗎?

Grails域類有點錯誤,因為應用程序的域層通常由持久類和非持久類組成。 但是Grails域類總是持久的。 您可以擁有非持久域(在傳統意義上)類,但它們必須位於src / groovy或src / java中。 這可能令人沮喪,因為域應用程序在應用程序中分為兩個部分。 我們已經有了非持久域類的請求,例如static persistent = false或類似的東西,但它還沒有實現。

我想如果你想利用域類的非持久性特性(例如驗證,依賴注入等),那么可以使用一些可以由數據庫支持但不支持的類。 您只需要在代碼中記錄它或具有某種約定,例如特殊的包結構或命名約定。 如果你從不調用諸如save()list()findAllByFoo()等GORM方法,那么就不會有任何數據庫訪問。

就DTO而言,它們可以是非干的,但有一個插件可以提供幫助 - 請參閱http://grails.org/plugin/dto 它有一段時間沒有更新,但我很確定它仍然有效。 它有一個很好的功能,它將使用語法domainObj as DTO從持久域類實例創建DTO實例。 您確實需要在類之間保持同步更改,但是通過腳本自動生成初始DTO。

我認為你走的是正確的道路。

1 - 只需要創建一個類來處理域類,就可以使模型更加耦合。 您正在創建更多依賴項,這顯然很糟糕。 你的物品應該能夠照顧好自己。

2 - 您的朋友正在談論的模型實際上被稱為貧血領域模型 ,您可以將數據與程序的邏輯分開,並且首先由Martin Fowler將其描述為反模式。 邏輯和數據之間的這種分離在程序編程中非常常用,但在面向對象編程中卻沒有(OOP的目的恰恰相反)。

3 - 減少代碼重用。

4 - 一旦必須初始化與數據分離的邏輯,就更難測試。 同時,數據通過您的系統泄漏。

DTO是你可以使用的東西,當然。 但不建議您這樣做。 它最初設計用於通過進程或層來傳輸數據(對象)。 然后,由於某種原因,人們開始在層之間使用它,這是不值得的。 使您的程序更復雜(一旦您將這些實體分布在您的應用程序中),它就允許全局訪問。

你正在做什么被稱為富域模型,並沒有使用它的問題。 但是,當然你應該小心。 如果你看到你的班級承擔了太多的責任,那么也許是時候設計另一個課程來幫助(也許你打破了SRP原則)。

看看如何在Grails中設計域對象。 他們鼓勵您編寫豐富的模型(驗證,數據庫事務等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM