一个方法多参数或多个方法一个参数


One Method with Multiple Parameters or Multiple Methods with One Parameter?

想象一个"Games"类,用于跟踪对手之间的比赛。有一个基于用户输入参数检索游戏的方法更好,还是有多个特定于检索目标的方法更好?

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

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提示将不胜感激。谢谢。

我越实践OOP,就越发现自己遵循了向方法传递参数的规则。有点像有很多层嵌套的if语句,我发现如果我有两个以上,我可能做错了什么。

保持你的代码简单。你写的是一个做一些事情的方法,而不是一个做所有事情的过程代码块。如果你想玩游戏,那就去玩游戏。如果您想获得日期范围的列表,那么就这样做。

然而,我要指出的是,你并不真的需要get_all_games() -你可以允许get_games_by_dates()不带参数地传递。如果它没有得到任何,那么它将获得所有日期的游戏(所有游戏)

我总是倾向于使用OOP代码。原因是它使您的代码更容易维护和阅读。函数越多,后面的代码就越容易理解

"特定于检索目标的多个方法"的好处是您可以添加/删除目标。使用带有大量参数的单一功能的问题在于,如果你决定添加/删除一种获取游戏的方式,你就必须改变界面。这会破坏任何使用它的代码。

每个方法应该尽可能简洁,只执行一个函数。

我会选择单独的方法,因为你使用了很多默认值的参数。

如果你想获得所有游戏,你必须这样做:

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

假设你的get_....()函数返回所有游戏数据,我将根据传入的id编写一个函数来返回这些数据,并编写一系列find_...()函数来返回找到的id数组。这将有一个额外的好处,使它更容易覆盖在子类中的数据检索代码。

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" ;
    }
}