2013-07-17 47 views
-1

我正在設計一個ExpenseManager應用程序並遇到了設計/重構決定。Account類和java.io.File之間的類比

帳戶是我的域對象(不變),它看起來是這樣的:



    public class Account { 
     private long accountId; 
     private String accountName; 

     //getters 

     //static nested builder to instantiate in an immutable fashion 
    } 

這不過是一個值對象(不是域對象:() 早些時候我曾deisgned(實施)一個的AccountManager類託管賬戶的創建,編輯,刪除等



    public class AccountManager { 
     public createAccount(Account account) { //impl } 

     //similarly edit, delete methods 
    } 

但是,當我讀到this文章,它讓我思考。


java.io.File類有一個方法createNewFile()這實際上會在底層文件系統中的文件的類比。文件類爲此使用FileSystem對象。同樣,我認爲我的Account類也應該有一個createNewAccount()方法並在內部使用AccountManager。

哪一個更好的設計決策?使用AccountManager進行帳戶操作或爲Account類提供創建,編輯和刪除的功能?

+0

倒投票????我認爲這是一個很好的問題。來自我的贊成票。 –

回答

1

你描述這樣你的客戶對象:

這不過是一個值對象

,我不認爲這是不合理的。如果上述情況成立,那麼我肯定會分開構建/實例化,並創建一個AccountFactoryAccountManager(如果需要,可以創建子類,跟蹤引用等)。另外,我不會把標準的Java類作爲一個很好的例子來遵循軟件設計。 File類已重新編譯爲Java 7,並且Date/Calendar類是衆所周知的惡夢。向他們學習,但不要虔誠地跟隨他們!

+0

+1。我甚至會提名'Account'作爲一個很好的候選人[POJO](http://en.wikipedia.org/wiki/Plain_Old_Java_Object)。 – Gamb

+0

@Brian謝謝你的建議。但我覺得SDK不可能是非常錯誤的。我知道他們犯了一些錯誤。回到這個問題,如果我使用AccountFactory,我會處理創建;但是編輯和刪除呢?另外,如果我的Account類是一個值對象,那麼究竟可以稱爲一個域對象呢? –

+0

@PravinSonawane我認爲Brian用'AccountManager'對象覆蓋了版本和刪除。管理人員通常負責CRUD操作。 – Gamb

0

java.io.File一個實例被創建爲路徑的信息,例如

File f = new File("C://myFile.txt"); // where "C://myFile.txt" is the path 

,當你調用f.createNewFile()File知道在哪裏創建一個文件(C://)和這將是文件名(MYFILE.TXT)

你應該問自己的問題是:

  • 當您創建AccountManager實例時,是否提供了創建Account實例所需的所有數據?
  • 一旦File對象被實例化,它指向一個File。一旦你的AccountManager被創建,它是否鏈接到相同的Account

如果不是,可能你可以用AccountManager.createAccount(String... data)的方法去。

+0

是的..這個比喻對於File對象來說相當不錯。我有創建所有數據,創建後,一個Account對象只會引用一個帳戶(它有一個accountId字段) –

0

我會堅持AccountManager類,並保持Account類不可變。

如果我從頭開始寫作,並且我的期限很緊,我會傾向於不編碼AccountManager類。現實情況是,我們在截止日期前生存和死亡,所以從學術角度來看,這可能是不好的推理,但現實是我們必須支付賬單。

鑑於這些類別存在,您的團隊可能會期望看到這種模式,因此可能有一個很好的理由。

有了AccountManager,我會說這是一個更好的設計。

+0

File代表VM外部的對象。但是這個班是不變的。因此,我相信,Account類也是不可變的。當然,最後期限很重要。但現在更好學習,永遠不要! ;) –

0

你混了兩件事情:createNewFile不創建java.io.File中的一個新的實例,但它創建了一個現實生活中的項目(可能是你的驅動器上的文件)。就你而言,類比是createAccount將你的數據發佈到你的銀行(或類似的)。

關於你的設計問題:這取決於是否添加一個方法到你的類中創建你的類的實例(即工廠方法)的幾個原因 - 個人喜歡就是其中的一個原因。我個人喜歡的是不要用過多的功能重載一個類,所以在你的特定情況下,我建議分開ValueObject和Manager。

+0

在我的情況下,createNewAccount()會在數據庫(真實生活項目)中創建一個條目 –

+0

AccountManager的另一點:不要使用與後端相關的代碼來優化ValueObject。 – bonger22

+0

我始終可以通過Account對象調用AccountManager本身(正是File類所做的) –

0

這個問題的答案取決於設計師的觀點。有些人認爲分離數據和模型會破壞面向對象的原則。

我建議創建一個AccountInterface(可以稱之爲IAccount或AccountI之類的東西)而不是AccountManager。這個接口可以有像createAccount等方法。這些方法可以具有POJO形式的請求 - 響應。 AccountInterfaceImpl可以編排業務邏輯。 當然,保持Account類作爲POJO仍然不錯。如果您使用的是JPA,我建議您將賬戶表的JPA實體和賬戶POJO等域對象分開。

相關問題