2011-10-18 54 views
3

想象一下用於追蹤對手之間比賽的「遊戲」類。有更好的OOP有1種方法來根據用戶輸入參數檢索遊戲,還是有更好的方法來獲取特定於檢索目標的多種方法?單參數多方法或單參數多方法的一種方法?

class Games { 
    function get_games($game_id = NULL, $stadium_id = NULL, $start_date = NULL, 
     $end_date = NULL, $count = 999); {} 
} 

VS

class Games { 
    function get_all_games($count = 999); {} 
    function get_game_by_id($game_id = 1); {} 
    function get_games_by_stadium($stadium_id = 1); {} 
    function get_games_by_dates($start_date = NULL; $end_date = NULL) {} 
} 

的好處和任何編碼/ snytax提示說明,將不勝感激。謝謝。

回答

2

我越是練習OOP越是發現自己遵循關於將參數傳遞給方法的規則。有點像有多層嵌套if語句,我發現如果我有兩個以上的話,我可能會做錯某些事情。

保持您的代碼簡單。您正在編寫一個可以執行某些操作的方法,而不是執行所有操作的程序代碼塊。如果你想獲得一場比賽,那麼獲得一場比賽。如果你想得到一個日期範圍的列表,那就這麼做。

但是我會指出,你並不需要get_all_games() - 你可以只允許get_games_by_dates()傳遞參數。如果它沒有得到任何,那麼它會得到自永遠以來的每一個日期的遊戲(所有的遊戲)

1

我總是會錯在OOP代碼的一面。原因是它使你的代碼更容易維護和閱讀。越多的功能越容易跟隨後面的代碼

0

我會去單獨的方法,因爲你正在使用大量的參數與默認值。

如果你想獲得的所有遊戲中,你必須做的:

$games->get_games(NULL, NULL, NULL, NULL, 999); 
0

假設你get_....()函數返回所有的遊戲數據,我會寫一個函數返回這個數據的基礎上,一個id傳入並編寫一系列find_...()函數以返回找到的id的數組。這將有更多的好處,可以輕鬆覆蓋decendant類中的數據檢索代碼。

class Games { 
    public function get_game($game_id) { 
     // Return game details (array/object) for $game_id, or FALSE if not found. 
    } 

    public function find_all_games() { 
     // Return array of ids for all games. 
    } 

    public function find_games_by_dates($start_date = NULL, $end_date = NULL) { 
     // Return array of ids between $start_date and $end_date unless NULL. 
    } 
} 

然後,您可以撥打:

$oGames = new Games() ; 
$aGames = $oGames->find_all_games() ; 
foreach($aGames as $id) { 
    $aGame = $oGames->get_game($id) ; 
    if($aGame !== FALSE) { // This check might be skipped if you trust the array of ids from find_all_games(). 
     // Assuming an array is returned. 
     echo "Game Found: ".$aGame['name']."\n" ; 
    } 
} 
0

的「具體到檢索目標多法」的好處是,你可以添加/刪除目標。將一個單片函數與一堆參數一起使用的問題是,如果您決定添加/刪除獲取遊戲的方式,則必須更改界面。這會破壞使用它的任何代碼。

每種方法應儘可能簡潔,只執行一項功能。