我係統中的一些資源使用基於Java集合的對象集合的概念。面向對象的方法橋樑
此集合類(抽象)爲另一個具體類(稱爲列表)提供基本功能,該類允許通過集合的索引查找對象。
我將使用我的HTTP頭文件類來解釋。
我在它的構造函數中有一個這個Lists類的實例。每個HTTP頭字段都通過Headers :: addHeader()方法添加到Collection中。
很顯然,我有一個名爲getHeaders(),它返回集合的存儲,不是集合的對象一個的getter方法。所以,如果我需要列出這個類以外的標題,我只需要調用$ obj - > getHeaders(),並且我有一個添加了所有對象的ArrayObject。
好吧!
但是,最近想出了使用List方法之一的必要性,Lists :: find(),它在Collection的存儲中找到一個Object,但它甚至不知道Object的名字或它的具體位置。
由於Lists對象位於私有屬性中,Headers :: getHeaders()返回Collection Storage,我不想違反封裝,通過將該屬性設爲公共屬性,我無法訪問此方法。
一切我的代碼,除了功能,必須在視覺上優雅,並創建另一個getter方法,讓我們說getHeadersLists()將產生調用,如:
$obj -> getHeadersLists() -> find('foo');
這是醜陋的!
於是,我趕緊加了__call()在頭類,它工作得很好:
$obj -> find('foo');
但我認識的人(而他在面向對象的主題非常精通)告訴我,這是不對的。
我的論點純粹是關注於可讀性,他反駁說:「在面向對象,魔術方法和可讀性不能共存」。
那麼是什麼?我應該怎麼做才能在這兩個類之間創建這個「橋樑」,而不使用_call()並保留面向對象的原則?
我知道,我可以在頭返回集合對象:: getHeaders(),並使用類似:
$obj -> getHeaders() -> find();
但是很多事情我瞭解面向對象的責任。正如其聲明所說,這種方法的責任是返回所有添加的頭,而不是外部對象。
+1在這裏相同。 – 2012-01-05 15:51:22
好吧,但受保護的可見性在這種情況下不起作用,因爲我沒有在繼承上下文中調用方法。以這種方式思考:標題**使用**列表而不是標題**是一個**列表。通過擴展Lists,我的Headers類將變得相關。 – 2012-01-05 19:49:21