当我尝试重构我的功能时,为了满足新的需求,我偶尔会偶然发现关键问题:
我要添加另一个带默认值的变量吗?或者我只能使用一个数组,我可以在不破坏API的情况下添加其他变量吗?
答案 0 :(得分:1)
除非您需要支持灵活数量的变量,否则我认为最好明确标识每个参数。在大多数情况下,您可以添加具有不同签名的重载方法,以支持额外参数,同时仍支持原始方法签名。如果使用数组传递变量,则会使API的用户感到困惑。显然,有一些输入适用于数组(多边形中的点列表,您希望执行操作的帐户ID列表等)但如果它不是您可能合理期望的变量数组或列表,您应该将它作为单独的参数传递给方法。
答案 1 :(得分:1)
就像编程中的许多问题一样,正确答案是“它取决于”。
以Javascript / jQuery为例,一个好的经验法则是每次调用函数时是否需要参数,或者它是否是可选的。例如,主jQuery函数本身需要一个表达式来确定操作将影响哪些元素:
jQuery(expresssion)
尝试将此参数作为数组的一部分传递是没有意义的,因为在调用此函数时每个时间都需要它。
另一方面,许多jQuery插件需要几个可选的杂项参数。按照惯例,它们通过'options'数组作为参数传递。正如您所说,这提供了一个很好的界面,因为可以添加新参数而不会影响现有的API。这使得API也很干净,因为用户可以忽略那些不适用的选项。
通常,当涉及多个参数时,将它们作为数组传递是一个很好的约定,因为它们中的许多肯定是可选的。这有助于清理许多WIN32 API,尽管在C / C ++中处理数组比在Javascript中处理更难。
答案 2 :(得分:0)
这取决于所使用的编程语言。
如果你有一个普通的OO语言,你应该使用一个你可以轻松扩展的对象,如果你真的关心API一致性。
如果这无关紧要,可以选择更改方法签名并使用更多/不同的参数重载方法。
如果您的语言不支持,并且您希望API是二进制稳定的,请使用数组。
答案 3 :(得分:0)
必须考虑几个因素。
答案 4 :(得分:0)
在他的书代码完成中,史蒂夫麦康奈尔宣布一个函数永远不应该有超过7个参数,甚至很少有。他提出了令人信服的论点 - 我不能从记忆中引用,唉。
清洁代码,最近,提倡更少的论点。
因此,除非通过的事物数量非常少,否则它们应该以包络结构传递。如果它们是同质的,则是阵列。如果没有,那么应该为此目的构建一个相当轻量级的对象。
答案 5 :(得分:0)
你不应该这样做。只需添加参数并更改所有呼叫者即可提供正确的默认值。原因是具有默认值的参数只能在结尾处,并且无法在参数列表中的任何位置添加任何必需的参数,而不会有被误解的风险。
这些是灾难的关键步骤: 1.使用默认值添加一个或两个参数 2.一些呼叫者将提供它,一些将依赖默认值。 [半年过去了] 3.添加必需参数(在它们之前) 4.更改所有呼叫者以接受所需参数 5.接听电话或其他会让您忘记更改第2部分中的一个实例的事件 6.现在您的程序编译完美,但无效。
不幸的是,在函数调用语义中,我们通常没有机会按名称说出哪个值在哪里。
数组也不是一个合适的解决方案。数组应该用作类似对象的连接,在这些对象上执行统一的活动。正如他们所说here,如果它值得重构,那么现在值得重构。