在一個類中,我有一個處理方法,它根據什麼post/get變量可用來執行操作。下面是一個簡單的例子:
public function handleAll(array $vars) {
if (isset($vars['var1'])) {
$this->doThisAction($vars['var1']);
} else if (isset($vars['var2'])) {
$this->doAnotherAction($vars['var2']);
}
}
所以在運行時的方法可以這樣調用$handler->handleAll($_POST)
。 問題是存儲在$ vars數組中的變量必須命名爲「var1」&「var2」等。這意味着處理代碼與html表單元素的名稱相結合或者在url中獲取變量(或者實際上鍵任何數組傳入)。
允許注入任何變量的數組使得該方法具有靈活性,這是必要的,因爲它也是多態的。類繼承此方法並用它來調用它自己的操作。這樣做的結果是,外部處理方法所需的功能並不明顯。這意味着必須檢查實現,找出它的功能(除非我將代碼複製到phpdoc中,這很愚蠢)。
我不知道如何解決這個問題。索引頁面(來自多個這樣的類)暴露出巨大的if/case語句會導致非常混亂的代碼,因此最好將所有這些封裝在方法中。此外,將它作爲負責調用操縱它自己狀態的行爲的類的一種方法是有意義的(責任驅動設計)。我想過把每個變量作爲方法的一個參數,但是對於某些類來說,參數列表會非常大。同樣,這意味着不同類的handleAll()方法不能自動調用,因爲每次調用都需要顯式注入所有參數,從而消除多態性方面。
總結我需要保持多態的方法,但我需要某種方式從HTML表單或網址的用戶輸入解耦處理代碼。這樣做也許有一種將接口與實現分開的方法。我很驚訝,我無法找到任何解決方案,這似乎是一個普遍的問題。
而不是'handleAll'處理所有事情,爲什麼你沒有單獨的方法處理他們期望的特定後期數據變量? – 2012-04-06 19:53:38
如果我要爲每個方法提供post變量,那麼我會在任何地方都獲得大量的if/else代碼。此外,多態性將被刪除,這意味着每個類都需要顯式調用每個類,這意味着許多對handleAll()的調用無法在循環中進行。如果我想使每種方法都能與特定的後置變量一起工作,所以不能注入依賴關係,那麼耦合問題依然存在。 – Jonathan 2012-04-06 20:08:08
你不能使用很多MVC框架之一嗎?他們默認提供你想要的。基本上你需要在應用程序中「分割」控制器,每個控制器都有自己的責任。國際海事組織目前的方法是多形態的。它更像是一個前端控制器。 – MikeSW 2012-04-06 20:55:14