【问题标题】:One Method with Multiple Parameters or Multiple Methods with One Parameter?一种方法多参数还是多方法一种参数?
【发布时间】:2011-12-10 07:05:42
【问题描述】:

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

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 提示。谢谢。

【问题讨论】:

    标签: php oop function methods


    【解决方案1】:

    我练习 OOP 越多,我发现自己越会遵守关于将参数传递给方法的规则。有点像嵌套了多层 if 语句,我发现如果我有两个以上的语句,我可能会做错事。

    让您的代码保持简单。你正在编写一个做某事的方法,而不是一个做所有事情的程序代码块。如果你想玩游戏,那就去玩游戏。如果您想获取日期范围的列表,请执行此操作。

    但是我要指出,您实际上并不需要 get_all_games() - 您可以只允许不带参数传递 get_games_by_dates()。如果它没有得到任何东西,那么它将永远获得每个日期的游戏(所有游戏)

    【讨论】:

      【解决方案2】:

      我总是会在 OOP 代码方面犯错。原因是它使您的代码更易于维护和阅读。您拥有的功能越多,以后就越容易遵循代码

      【讨论】:

        【解决方案3】:

        我会选择单独的方法,因为您使用了许多具有默认值的参数。

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

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

        【讨论】:

          【解决方案4】:

          假设您的 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" ;
              }
          }
          

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-02-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-17
              • 1970-01-01
              • 1970-01-01
              • 2015-08-14
              相关资源
              最近更新 更多