我正在构建一个多语言API来查询键值存储,我正在讨论(使用我自己)关于是否使用固定参数列表或使用哈希表的动态参数列表。
一般来说,我确实意识到使用哈希值时无法进行静态类型检查,但只要有单元测试,这就不是问题了。但还有其他缺点吗?
例如,使用参数:
set(Key,Value)
:并使用哈希:
set(key: Key, value: Value)
更新: 我读过这个: 在某些情况下,关键字通信不如位置。最明显的是对定义的过程的调用只有一个参数。当然,关键字是不必要的。通常,没有默认值的键控将需要更多的击键;使用默认值的keywording将需要更少。对于今天的一些机器,关键字序列的处理将比位置序列的处理更昂贵。最令人不安的缺点可能是,程序员的一个参数的无意识遗漏可能导致程序执行错误,但没有明显的错误,因为将使用该参数的默认值。
答案 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)
关于哈希值,有几件好事:
在一件非常糟糕的事情上:
关于命名参数,有几件好事:
对于坏事:
NULL
。
现在,一般来说:
答案 1 :(得分:1)
传入哈希的另一个问题是密钥上的拼写错误。在你的函数中,你不仅需要在散列中查找你想要的参数,而且你必须寻找你没想到和抱怨的参数,万一它是一个错字。有点额外的负担。
但对我来说最有力的论据是参数哈希不允许编译时参数检查。我同意Pascal的观点,如果你有一堆参数,其中大部分都是可选的,那么它就是合适的。
答案 2 :(得分:1)
一般来说,我确实认识到使用哈希时不能进行静态类型检查,但只要有单元测试就不会有问题。
这是一个有争议的意见。像Python这样的高动态语言的支持者倾向于这样思考,而像C ++ / C#这样的静态语言的支持者倾向于不同意。
“在野外”开展了两种项目,我可以保证大多数Python项目都没有单元测试来覆盖基本的函数契约,但是每个C ++ / C#项目都有相同的东西效果 - 编译器的检查。
许多人不同意,但我个人不会把这个限制写成“只是写单元测试” - 因为大多数人都没有。