【问题标题】:Should I implement multi-purpose functions?我应该实现多用途功能吗?
【发布时间】:2009-09-02 01:48:46
【问题描述】:

我正在使用 CodeIgniter,并且我有一个模型可以获取所有可以设置偏移量和限制的食谱。我应该扩展该功能以检索单个食谱吗?这是个好习惯吗?

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    您的目标应该是最大限度地减少代码重复,同时最大限度地提高可理解性。这两个经常发生冲突。你可以得到最少的代码重复,但一个函数有 12 个可选参数。所以一些一般提示:

    • 考虑将常用功能打包到第三个函数中,然后这两个函数都可以根据需要调用它;
    • 如果函数的参数超过 3-4 个,则使用对象或参数数组;
    • 代码重复将被最小化而不是完全消除。有时最清晰的解决方案涉及一定数量的代码重复;
    • 函数或对象的用途应明确。如果它的作用完全基于一个参数而改变,那么你很可能会让人们感到困惑。

    对于您的具体情况,我想您最终希望得到以下结果:

    function get_recipes($offset, $limit) {
      // execute query and get resource
      $ret = array();
      while ($row = mysql_fetch_assoc($rs)) {
        $ret[] = build_recipe($row);
      }
      return $ret;
    }
    
    function get_recipe($id) {
      // execute query and get row object
      return build_recipe($row);
    }
    
    function build_recipe($row) {
      // construct a recipe object from the row
    }
    

    【讨论】:

    • 其实我已经结合了get_recipe和get_recipes。如果设置了 id 并且其他参数为 null,则它只返回一个字段等。可以吗?
    • 我认为这可能有点令人困惑,但没有具体细节很难说。作为一般规则,我更喜欢像我所做的那样具有明确命名的函数(尽管这三个可以更好地命名)的方案,这些函数使用函数分解来减少重复。
    • 我同意 cletus 将 get_recipeget_recipes 分开。维护您的代码的人会更容易理解您的代码。
    • 我同意它更容易维护,我赞成。感谢您的洞察力:)
    【解决方案2】:

    一般来说,为了清楚起见,一个函数应该执行一个任务。但是,“获取 N 行”是一项任务——即使 N==1;所以我会说这种情况是合格的,即该功能并不是真正的“多用途”!-)

    【讨论】:

      【解决方案3】:

      这个问题的答案很简单。

      记住Worse is better

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-17
        • 2011-02-07
        • 2011-10-15
        • 2018-05-26
        • 2023-03-09
        • 1970-01-01
        • 2020-05-07
        • 2011-11-15
        相关资源
        最近更新 更多