2012-11-15 42 views
0

我有以下對象上文獻狀態:L1UserL2UserL3UserDocument(都來自User繼承)。
每個用戶都可以創建文檔,但取決於用戶類型,文檔將具有不同的狀態。所以,如果這是L1User,該文件將與L1狀態等創建:依賴用戶類型對象

enter image description here

解決方案1 ​​
請注意,後創建的文件,它將被保存在數據庫中,所以在Document對象中有一個方法create_document(User user)應該很自然。在方法體中,我可以檢查哪種類型是用戶,並手動設置適當的狀態。這種方法對我來說似乎不是OOP。

解決方案2
好了,接下來的辦法是讓所有用戶實現一個共同的方法(比如create_document(Document doc))將設置與用戶相關聯的狀態,並保存該文檔在數據庫中。我的疑問是,文檔應該保存在自己的類中,而不是用戶。

溶液3
所以最終的方法將與上述類似,不同之處在於用戶將返回修改的文檔對象到它的create_document(User user)方法和保存將在那裏進行。該方法的定義是這樣的:

create_document(User user) 
{ 
    this = user.create_document(this); 
    this->save(); 
} 

它也似乎並不正確,我...

任何人都可以提出一個更好的辦法?

回答

1

我認爲,從OO的角度來看,解決方案2和3都可以,因爲您正在將狀態分配委託給用戶對象(與解決方案1相反,您基本上是在基於用戶進行切換類型)。是否選擇2或3更多是個人品味的問題。

但是,我有一個疑問:爲什麼您將文檔傳遞給create_document()方法?我會去找一個最能描述它做什麼的消息名稱。例如,在溶液3(一個我喜歡的最)我會去:

Document>>create_document(User user) 
{ 
    this = user.create_document(); 
    this->save(); 
} 

然後

L1User>>create_document() 
{ 
return new Document('L1'); 
} 

Document>>create_document(User user) 
{ 
    this = new Document() 
    this = user.set_document_type(this); 
    this->save(); 
} 

然後

L1User>>set_document_type(document) 
{ 
document.setType('L1'); 
} 

編輯:我一直在想這個,實際上有第四種解決方案。然而,只有當文檔的狀態在整個生命週期中不發生變化時,以下方法纔有效,並且可以使用getter而不是屬性來映射DB字段。由於文件已經知道了用戶和狀態取決於用戶,你可以委託:

Document>>getStatus() 
{ 
    return this.user.getDocumentStatus(); 
} 

HTH

+0

感謝您的輸入。我決定採用解決方案#2,因爲我還有其他方法可以實現,並且對所有這些方法都遵循一種通用樣式更容易。 – matino