我正在使用PHP的MVC框架,但我主要使用java,我正在尋找解決這個問題的方法,該方法遵循OOP原則,並且可以轉換爲其他語言。MVC:我如何減少多態方法的數量?
我有一些數據(數據庫,XML,等等)進行交互的模型抽象類。繼承的類必須實現這些方法:
abstract class Model {
abstract public function nextItem();
abstract public function insert(Map $item);
abstract public function update(Map $item);
abstract public function delete(Map $item);
abstract public function exists(Map $item);
abstract public function countItems();
abstract public function allItems();
控制器通過其保持關於要被插入的,更新的項目的信息的地圖對象,刪除等。這意味着模型和控制器被解耦和任何模型可以注入控制器,只要有這些方法的實現。
當使用這個類在實踐中我發現,已經出現了情況,其中由控制器所需要的操作是非常獨特的,例如以特定的方式重新排序的數據。這是一個壞的解決方案:
abstract public function reorder(Map $item);
該解決方案意味着每個模型必須實現這種方法,這是不必要的。另外想象一下,如果我需要其他方法,抽象方法的數量將會增長並增長,每個方法都需要一個實現。
另一解決方案是這樣的:
abstract public function action(Map $item, $action)
的$操作變量將其限定了一操作的字符串。所以,你可以實現不同的方法,但只與多態動作()方法調用它們:
if ($action === "reorder") { $this->reorder($item); }
這種解決方案的唯一問題是,正確的命令是不能從方法簽名明顯。例如,$ action字符串可以是任何東西,另一個開發人員將不得不檢查方法體(實現)來查找可接受的字符串。簡單地在文檔中陳述它們似乎是一個簡單的解決方案。另外,如果一個模型被注入一個沒有實現所有需要的操作的控制器中呢?拋出異常?
好像我必須缺少某種真正明顯的解決方案的,我不希望繼續前進,實現上述一個,然後有在很大程度上重構後,當我找到一個更好的。有任何想法嗎?
編輯: 到目前爲止,使用多個接口似乎是最好的解決方案。雖然有一個類型安全問題。如果我要將實現接口ReOrderable的模型注入到我的Controller類中,我希望能夠執行__construct(實現這些接口$ model的任何模型)。我可以創建更多抽象類,如ReOrderableModel,然後執行__construct(ReOrderableModel $ model),但可以有任意數量的接口組合,並且我必須爲每個接口定義一個額外的抽象類。我也可以將Model變成一個接口並使用多接口繼承,但實質上卻出現了同樣的問題。我肯定錯過了什麼。
當前表單中的結構違反了[單一責任原則](http://en.wikipedia.org/wiki/Single_responsibility_principle)。爲什麼? – 2012-03-14 02:37:44