【问题标题】:Best way to pass values to a function when there are many to send?当有很多要发送时,将值传递给函数的最佳方法是什么?
【发布时间】:2010-09-19 06:57:53
【问题描述】:

当您必须将许多值传递给函数并且其中一些可能是可选的时,定义方法签名的最佳方式是什么。将来,可能我必须传递更多变量或减去一些传递给函数的值。

例如:(电话和地址可选)

function addInfo( $name, $dob, $phone='', $address='' ) {
       // Store data
}

addInfo( 'username', '01-01-2000', '1111111' ); // address is not given

function addInfo( $info ) {
    // Store data
}

$info = array( 'name'=>'username', 
               'dob'=>'01-01-2000', 
               'phone'=>'1111111', 
               'address'=>'' );
addInfo( $info );

【问题讨论】:

    标签: php oop methods method-signature


    【解决方案1】:

    Martin 在“Clean Code”中建议,您应该将参数的数量限制为最多 2-3 个,以使代码易于理解。所以最好将它们包装成一个对象并将对象作为参数传递。这绝对是可取的。

    【讨论】:

      【解决方案2】:

      还有一种类似 OOP 的方式:创建带有字段 'name'、'dob'、'phone'、'address' 的参数对象(例如,person)(这在 Fowler 的“重构”中称为 Introduce Parameter Object refactoring书)。 这似乎适合您的情况,因为您传递给函数的所有字段实际上都与一个对象相关。

      【解决方案3】:

      虽然函数的第二个版本似乎更好,但事实并非如此。那是因为你不知道函数需要什么样的数据。元素数组太通用了。一个对象会更适合恕我直言。一个类对象是很好定义的,你期望的地方,例如。一个 Employee 对象,而您使用 Employer 调用该函数,调用将失败。

      所以,总而言之,我会使用第一个版本或类对象方式。

      【讨论】:

        【解决方案4】:

        我更喜欢第一个版本,因为它更明确,因此对程序员更友好。程序员一眼就能看出函数的期望。

        如果函数可以接受大量(可选)参数,则首选第二个版本。在这种情况下,将它们捆绑在一起并将它们作为一个单元传递是有意义的。

        我不知道要评论的性能影响。我怀疑如果有的话,惩罚不会很严重。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-31
          • 2022-12-05
          • 2021-09-25
          • 2018-01-07
          • 2020-10-18
          • 1970-01-01
          • 2021-12-29
          • 2011-02-08
          相关资源
          最近更新 更多