2010-04-20 42 views
10

在大多数其他面向对象的语言。让每个函数接收一个对象的单个关联数组而不是枚举方法签名中的每个对象会是亵渎。但是,为什么这两种语言在大多数流行的框架中都可以接受和常用?为什么配置数组在PHP和Javascript中可接受的参数?

除了希望有简洁的方法签名之外,还有一些理由吗?

我确实看到了一个好处 - API可以随着新的可选参数的添加而保持不变。但是Javascript和PHP已经允许在他们的方法签名中使用可选的参数。如果有的话,似乎Java或另一种面向对象的语言将从这个更多的受益...然而我很少看到这种模式。

什么给?

回答

2

主要原因是这些特定的语言根本不支持对同一个函数名称使用多个调用约定。 I.E.你不能做到以下几点:

public function someFunc(SomeClass $some); 
public function someFunc(AnotherClass $another); 
public function someFunc(SomeClass $some, AnotherClass $another); 

所以你必须找到另一种方式来创造更简单的方法是传递你的变量,在PHP中,我们结束了someFunc(array('some'=>$some, 'another'=>$another)),因为它是唯一便捷的方式。在JavaScript中我们最终使用了对象,这并不是很糟糕:someFunc({some: something, another: anotherthing})

10

在我看来,很多这些功能在他们接受的参数数量上攀升,超过10个并不少见。即使你做可选参数,你仍然必须按顺序发送它们。

考虑像一个函数:

function myFunc(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13){ 
    //... 
} 

说你希望只使用参数3和11。这里是你的代码:

myFunc(null, null, null, 'hello', null, null, null, null, null, null, null, 'world'); 

不会吧,而只是:

myFunc({ 
    a3 : 'hello', 
    a11 : 'world' 
}); 

1

首先,这种技术对于编码者来说非常简单。

他们不需要记住应用程序中所有函数的所有参数的顺序。代码变得更可读和更强大。

任何未来的开发,改进或重构都不会如此难以提供。代码变得更易于维护。

但有一些缺陷。例如,不是每个IDE都会给你一个简单的代码,完成这些功能和它们的参数。

4

这有几个原因。

首先,并非所有参数列表都有自然顺序。如果有一个用例只提供第一个和第六个参数,那么现在必须填写四个默认占位符。杰格说明了这一点。

第二个问题是,很难记住参数必须出现的顺序。如果以一系列数字作为参数,则不太可能知道哪个数字意味着什么。以imagecopyresampled($dest, $src, 0, 10, 0, 20, 100, 50, 30, 80)为例。在这种情况下,配置数组的行为就像Python的命名参数。

0

在有2个原因我觉得为什么这已演变:

  1. Array的是很容易创建和操纵,甚至混合类型。
  2. PHP/JS程序员经常没有学术背景,并且从Java和C++等语言中灌输较少。
2

红宝石如下这种方法,以及,甚至设计专为使用散列作为初始化意味着更简洁的语法,红宝石1.9:

# old syntax 
myFunc(:user => 'john', :password => 'password'); 

# new syntax 
myFunc(user: 'john', password: 'password'); 

被解决的问题是,在这些语言,您不能基于参数类型重载函数。这导致复杂的类有一个构造函数,它可能有一个庞大而笨拙的参数列表。使用类似散列的对象来提供参数允许按参数名称而不是按类型进行伪重载。

我唯一的这种做法真正的问题是难以记录你的论点: PHPDoc for variable-length arrays of arguments

2

之一,为什么你没有看到这个在其他面向对象语言的最重要的原因是,你可能指的是编译语言如C++或Java。

编译器负责在编译时不在执行过程中确定要调用哪种方法,这通常是基于签名完成的,所以基本上必须这样做。这也是如何在这些语言中完成方法重载的。

相关问题