3

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

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

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 );
4

4 回答 4

4

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

于 2010-09-19T07:14:36.150 回答
3

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

于 2010-09-19T07:09:08.017 回答
1

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

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

于 2010-09-19T07:22:41.590 回答
0

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

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

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

于 2010-09-19T07:00:59.990 回答