2010-04-04 43 views
1

我的問題更像是一個理論。對象責任 - 列表和項目

假設你有一個對象,它表示的事情列表(文章,頁面,帳戶等)

class ObjCollection 

你有一個類,它代表收集的特定項目:

class objItem 

我有一個思考每個對象的基本職責的問題。

哪個班級負責創建新的objItem

哪一類負責刪除objItem?它應該刪除自己作爲一種方法?


更新1: Techpriester:它是確定使用對象的構造函數的函數來創建新的項目? 我認爲像的:

class objItem { 
    public function __construct($id = 0) { 
     if ($id > 0) { 
      // load item data... 
     } else { 
      // make new item... 
     } 
    } 
} 

但是,如果有什麼東西在代碼中出現問題,而是,它傳遞0傳遞一個的$ id> 0的?在這種情況下,更多預期的行爲將是空的對象,而不是新的對象,或者我錯了嗎?

回答

1

我知道這不能回答你的問題,但是因爲你把它標記爲PHP,我將假設它幾乎肯定會應用於某種數據庫模型。

在這種情況下,徹底廢除'集合'可能是一個好主意,因爲如果您讓每個類僅代表一個對象,例如,如果您想查看10篇博客文章,則可以調用10個獨立SELECT查詢每個只檢索單個數據庫記錄,因爲您決定讓'BlogPost'類封裝其檢索方法。

另一種方法是讓類表示一個或多個記錄,這樣,只需運行一個SELECT查詢,無論您是檢索5000條記錄還是隻有一條。幾乎每個object-relational-mapper都這樣做。

在做面向對象編程,這是更好地認爲在行爲責任不是對象是否是一個有形的「東西」條款。這就是面向對象的理論討論的問題。使用類似動物和水果等與真實世界編程無關的類比是非常誘人的。

3

思考這個的一種方式:

objItem通常有一個類構造函數,因此該類可能是負責創建objItem類型的對象。

objItem插入列表/集合假設objCollection可以objCollection責任從集合中刪除它。

0

由於物件本身無法刪除,所以必須是集合的責任。

無論您讓集合創建它像$collection->makeNewItem();對象(然後調用構造函數的物品),或直接使用$item = new Item();,然後一些$collection->addItem($item);方法完全取決於你和你的應用程序的需要。

我建議使用常規實例化,如果項目本身也在集合之外使用。

2

objItem通常有一類 構造函數,因此這個類是 負責創建 型objItem的對象。

構造函數與責任無關(通常)。以這種方式思考,每個對象都只會對自己負責。

責任是一個概念不直接綁定類層次結構。

如果:

ObjCollection = Nest objItem = Egg。還有第三個對象Bird,然後Bird負責創建egs(即使巢中含有蛋)。這不是關於編程它是關於常識...... :)

有沒有像「空對象」這樣的事情。對象具有「狀態」。你可以創建一個對象然後擁有它,或者你可能不創建它,那麼就沒有對象。

所有你必須擔心的是,如果你的構造函數在兩種情況下都能正常工作,並且創建了新對象並且沒有它。

通常最好將對象作爲構造函數參數(而不是$ id)注入,而不是在另一個對象內創建它。

+1

+1與鳥類相比,它使這個事情更清晰。 – 2010-04-04 19:58:47