2014-01-08 13 views
2

在我的項目的業務邏輯,我大多有「值對象」「經理人」面向對象設計 - 我的值對象是否只包含getter?

值對象到處都是。他們可以是用戶,汽車,照片,相冊等。

管理者存在以控制它們的值對象。它可以是UserManager,CarManager,PhotoManager,AlbumManager等等。他們使用值對象創建/刪除/ getList和其他操作。

現在我面臨的問題:我的價值對象應包含設置器 我的第一個意見是沒有,因爲我認爲更好的價值對象狀態將只能由他的經理控制。

但有一個糟糕的副代碼重複和明顯的雙重工作。

沒有制定者,我的經理將不得不方法,如userManager.addPhoto(userToAddTo, photoToBeAdded),在內部調用user.addPhoto(photo)(在實現方法addPhoto存在,但不是在接口)。沒關係,如果只有幾種這樣的方法,但是當它得到很多這樣的「二傳手」方法時,經理似乎有點難看,這顯然是雙重工作。

那麼,我應該在我的價值對象中使用setter嗎?

+0

使用擴展和工廠模式存儲等有什麼錯誤?所以你有一個通用的經理類,然後根據需要擴展它 – Dave

回答

1

您的價值對象是數據訪問層的一部分,管理者是業務邏輯的一部分。所以setter和getters是數據訪問層的一部分,而不是業務邏輯的一部分。當您不確定要在哪個層執行特定操作時,您還必須考慮實體或業務邏輯的可重用性。

http://en.wikipedia.org/wiki/Multilayered_architecture

但要小心。你只有實體應該有這樣setter方法:

/** 
    * @param Name 
    */ 
    public void setName(sName) { 
     m_sName = sName; 
    } 

如果你這樣做,因爲重用的具體的一些東西值,業務邏輯的其本身而言,。

+0

值對象和管理器都是*域邏輯*的一部分。訪問數據訪問層是通過管理器實現進行的,因此除了他們知道數據訪問層 – pleerock

+0

值對象是實體之外,其他人都不知道。如果你想將這些實體存儲在一個數據庫中,他們不能成爲數據訪問層的一部分? – kai

+0

值對象只是在域邏輯中使用的接口。它們可以存儲在任何地方 - 文件系統,數據庫等等。他們存儲在哪裏 - 取決於實施 – pleerock

0

我會說「是的」,我也會避免諸如userManager.addPhoto(userToAddTo,photoToBeAdded)之類的東西,轉而使用像user.addPhoto(photo)這樣的更豐富的域模型。

我認爲大多數的OOD設計社區已經在'繼續前進,爲屬性添加setter和getters'這個方面。當然,有些純粹主義者認爲你應該一次只管理完整的狀態,但這不切合實際。

如果你看看像C#或Groovy這樣的語言,他們已經讓getter和setter的思想有點過時了,依靠各種機制來簡單地處理直接可分配/可讀的屬性,並允許一些'under-the -hood」另外的get/set邏輯:

class Person { 
    String name 
    String lastname 

    // for some dumb reason, always 'get' upper-cased last names 
    String getLastname() { 
    return this.lastname.toUpperCase() 
    } 
} 

總之,我贊成OO設計中對象代表狀態的業務邏輯,簡單的狀態不貧血的反射像在數據庫表中的一行。

我還會考慮問自己爲什麼要用簡單/啞值對象開始。是否需要它們,例如通過電線跨越系統邊界?

0

在提前我會說我不明白你必須在價值對象和經理對象之間拆分你的設計的原因,你可能有一個完美的理由這樣做。就我而言,我總是使用自己的getter和setter方法來實現數據傳輸對象,如果我認爲我必須爲API用戶辯護;),我嘗試遵循Josh Bloch在Effective Java中提出的防禦方法。

這個意思是,如果我不想讓API用戶修改我正在返回的DTO,我將使用final修飾符使這些對象不可修改,並在必要時返回其屬性的防禦副本......任何必要的。 Java與Strings或Integers一樣。

當然,如果你的經理做別的事情比寫性能,那麼它們是業務邏輯的一部分,無論你正在做的是天經地義

+0

的主要原因是可重用性! – kai

+0

你的代碼是某人的API嗎?有人會在你的基礎上構建代碼嗎?在這種情況下,我建議你考慮不可變的方法 –

+0

或者我今天特別密集以查看設計的原因,所以請不要太認真:P –

0

不,你的財產必須有一個setter設置它在所有。當屬性由其他屬性組成時,使用setter-less屬性。