将函数参数作为哈希表/字典中的命名值传递的缺点是什么?

时间:2010-03-04 11:46:26

标签: api

我正在构建一个多语言API来查询键值存储,我正在讨论(使用我自己)关于是否使用固定参数列表或使用哈希表的动态参数列表。

一般来说,我确实意识到使用哈希值时无法进行静态类型检查,但只要有单元测试,这就不是问题了。但还有其他缺点吗?

例如,使用参数:

set(Key,Value)

:并使用哈希:

set(key: Key, value: Value)

更新: 我读过这个: 在某些情况下,关键字通信不如位置。最明显的是对定义的过程的调用只有一个参数。当然,关键字是不必要的。通常,没有默认值的键控将需要更多的击键;使用默认值的keywording将需要更少。对于今天的一些机器,关键字序列的处理将比位置序列的处理更昂贵。最令人不安的缺点可能是,程序员的一个参数的无意识遗漏可能导致程序执行错误,但没有明显的错误,因为将使用该参数的默认值。

3 个答案:

答案 0 :(得分:1)

使用PHP,你会得到类似于你的函数的东西:首先,使用参数:

function my_function($username, $password) {
    // Work with $username and $password
}

使用“哈希值”,您将使用数组:

function my_function($params) {
    // Work with $params['username'] and $params['password']
}

(其他语言也是如此 - 例如Javascript)


关于哈希值,有几件好事:

  • 您可以使用任意数量的参数
  • 您可以按任意顺序传递它们

在一件非常糟糕的事情上:

  • 您不知道可以通过哪些参数!
    • 您的IDE不会提供任何帮助
    • 您将无法从代码中提取该信息


关于命名参数,有几件好事:

  • 更好的自动检查:如果您没有传递预期的参数,您可以在IDE或编译/执行时收到警告
  • IDE中更好的文档/提示:输入函数的名称,您将获得预期参数列表及其(描述性)名称。

对于坏事:

  • 您必须严格按顺序传递参数
  • 如果您想省略某些参数,则必须为它们传递一个特殊值,例如NULL


现在,一般来说:

  • 当我只有几个参数时,我使用命名参数
    • 它使功能更加清晰:只需看看它的定义,你知道如何使用它
  • 当我有更多参数,但几乎所有参数都是必需的时,我通常使用命名参数
  • 当我有很多参数,但大多数都是optionnal时,我通常使用哈希值。

答案 1 :(得分:1)

传入哈希的另一个问题是密钥上的拼写错误。在你的函数中,你不仅需要在散列中查找你想要的参数,而且你必须寻找你没想到和抱怨的参数,万一它是一个错字。有点额外的负担。

但对我来说最有力的论据是参数哈希不允许编译时参数检查。我同意Pascal的观点,如果你有一堆参数,其中大部分都是可选的,那么它就是合适的。

答案 2 :(得分:1)

  

一般来说,我确实认识到使用哈希时不能进行静态类型检查,但只要有单元测试就不会有问题。

这是一个有争议的意见。像Python这样的高动态语言的支持者倾向于这样思考,而像C ++ / C#这样的静态语言的支持者倾向于不同意。

“在野外”开展了两种项目,我可以保证大多数Python项目都没有单元测试来覆盖基本的函数契约,但是每个C ++ / C#项目都有相同的东西效果 - 编译器的检查。

许多人不同意,但我个人不会把这个限制写成“只是写单元测试” - 因为大多数人都没有。