【问题标题】:Programming practice with a function带函数的编程练习
【发布时间】:2011-11-01 08:56:22
【问题描述】:

我有一个返回 整数 的函数,但是我想扩展它以添加一个新参数。然而,有了这个参数,函数必须返回一个 array

  • 有一个基于参数返回数组或整数的函数是不好的做法吗?
  • 如果是这样,我该如何解决?

我认为将整个函数复制粘贴 4-5 行也是一种不好的做法。

【问题讨论】:

  • 好问题。也许适合程序员。

标签: php class function methodology


【解决方案1】:

如果可能的话,我会从另一个函数中调用一个函数。

function getSingle($arg)
{
    // Do whatever it is your function should do...
    return 1;
}

function getMultiple($args)
{
    $out = array();
    foreach ($args as $arg) {
        $out[] = getSingle($arg);
    }

    return $out;
}

对于您心目中的功能,可能无法做到这一点,但它可能是一个不错的选择。


作为一个额外的说明,由于函数是相互关联的,我会将它们写成类方法来将它们“组合”在一起。

Users 为例;我可能需要一个函数来获取单个用户,而另一个函数来获取多个用户。在一个类中收集这些方法是有意义的:

class Users
{
    public function getUser($id){}

    public function getUsers(array $id = null){}
}

【讨论】:

    【解决方案2】:

    在 PHP 中,我会说“一个函数一个输出类型”。 (除了值 FALSE 在 PHP 中具有特殊含义)。如果 PHP 支持重载,那可能会有所不同,但事实并非如此。但这里有一个问题,为什么不简单地将这两个函数都包装起来呢?

     function my_wrapped_function($param1, array $param2)
     {
         return $param1 * count($param2);
     }
    
     function get_array_from_wrapped( $param1, array $param2 )
     {
         return array( $param1, my_wrapped_function($param1, $param2));
     }
     function get_int_from_wrapped( $param1, array $param2 )
     {
         return my_wrapped_function($param1, $param2);
     }
    

    【讨论】:

      【解决方案3】:

      在我看来,这是一种不好的做法,因为它可能会导致使用它时出现问题,因为您并不总是知道从函数中获取的是 int 还是数组。

      我的建议

      总是返回一个数组(即使它是一个项目长),并且有一个更通用的函数,很容易处理。

      【讨论】:

      • 这些函数是为了处理错误,而不是典型的情况。而且它很麻烦,所以不能相信它是可取的。
      • @hakre 是的,但我 100% 确定我看到了一个至少返回一次 int 或数组的函数,只是我无法理解它。
      • 只有那些存在并不意味着它是推荐的。我知道确实存在这样的功能,但 OP 正在寻找一些指南,我只想指出它可能不值得推荐。
      • @hakre 指出,我会改变我的答案(现在我想起来了,不可维护的功能是一种不好的做法)。
      【解决方案4】:

      如果您的函数修改多个值,我反对将内容作为数组返回,那么您编写的函数可能不是正确的,您可能需要两个函数来实现相同的.. 一个主要的这个干净和可维护的代码的原因,明天一个新人不需要去想知道他会发生什么已经说过在这种情况下你必须修改多个参数的情况下打电话看看方法做了什么并返回正确的值,另一个值通过引用传递它并编辑它。

      这里是一个引用传递的例子..

      <?php
      function foo(&$var)
      {
          $var++;
      }
      
      $a=5;
      foo($a);
      // $a is 6 here
      ?>
      

      【讨论】:

        【解决方案5】:

        你在这里说出一些原则:

        1. 使函数参数具有一种含义(并且函数在理想情况下为零参数,不惜一切代价避免更多参数)。
        2. 让函数只做一件事。
        3. 不要重复自己。

        我认为这三个都是有效的。您的问题听起来像是 3. 和 2. 或 1. 之间的交易。我认为您不应该将它们相互交易。

        您没有分享太多关于您尝试使用该功能实现的目标,因此完全抽象,我可以看到以下路径:

        1. 您遇到了设计问题。重新设计和重构您的代码。

        嗯,听起来有点像在说聪明话,但老实说,您可能没有正确使用迭代器(foreach),或者您开始​​创建一个“一个函数完成所有任务”的函数——这是您不应该的。这最终会重复代码。

        【讨论】:

        • 你所说的“并且功能理想地为零参数”是什么意思?
        • @Marvo:只是函数应该有尽可能少的参数,理想情况下没有 - 当然,这并不总是可能的。所以“理想”。
        • 虽然我听说过将参数数量保持在较低水平或低于特定限制以生成可维护代码的规则,但我从未听说过理想的数量是零参数。几乎按照定义,函数需要一些参数。
        • 这正是重点。理想情况下,一个函数的参数为​​零,如果您查看类,这种情况更常见。在过程编程中,也可能出现这种情况,但是要实现零参数要困难得多,实际上,零参数只是理想的情况,实际上我们需要拥有尽可能多的参数。只是说,保持干净的代码的数字低。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-22
        • 2011-08-24
        • 2016-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多