函数变量签名/参数

时间:2015-10-04 23:02:43

标签: javascript arguments ecmascript-6

我有一个带有可变参数的函数,类似于

function fn(...args) {
    let str, arr, obj;

    if (args.length == 1) {
        if (typeof args[0] == 'object') {
            obj = args[0];
        } else {
            str = args[0];
        }
    } else if (args.length == 2) {
        str = args[0];
        if (typeof args[1] == 'object') {
            obj = args[1];
        } else {
            arr = args[1];
        }
    } else if (args.length == 3) {
        [str, arr, obj] = args;
    }
}

API就是

fn()
fn(String str)
fn(Object obj)
fn(String str, Array arr)
fn(String str, Object obj)
fn(String str, Array arr, Object obj)

故意在类型上松散(例如,某些参数可能未定义)。

这是浏览器代码,相当紧凑。这肯定是可行的,但是有更好的食谱,更少的冗长和更易于维护吗?任何节点或通用JS库能够在足迹和依赖性方面保持适度的同时完成脏工作吗?

1 个答案:

答案 0 :(得分:2)

"问题"我看到这一点,你不仅要使用可变参数进行重载,还要重载参数 types 。这种组合导致了一个混乱的实施,从长远来看只会伤害你。

这是一种使用辅助功能编写它的不同方式,但你仍然处于痛苦的世界(更多下面)。

function fn(...args) {
    function aux(str, arr, obj) {
       // this function will always have str, arr, and obj
    }

    // Warning: this has an error anyway because (typeof []) is also 'object'

    switch (args.length) {
      case 1: return typeof args[0] === 'object'
                ? aux(null, null, args[0])
                : aux(args[0], null, null);

      case 2: return typeof args[0] === 'object'
                ? aux(args[0], null, args[1])
                : aux(args[0], args[1], null);

      case 3: return aux(args[0], args[1], args[2]);
    }


}

通过上述实现,您可以使用 5 独特的方式来调用您的函数,所有这些方法都是可以接受和适当的。

<强>缺点

  1. 难以记住API - 我将根据哪些参数获得结果?当我传递一个字符串和一个对象时,我先通过哪一个?等
  2. 重构噩梦 - 如果需要更改功能,则需要支持所有5种类型的呼叫。一旦您通过单个函数api强制执行了所有5个行为,就无法在不破坏针对此函数编写的现有代码的情况下分离行为。
  3. 函数定义中异常复杂的样板 - 大多数函数只是将参数映射到它们的本地参数,并且这些函数都是由JavaScript本身为您完成的。您的函数现在有一堆代码更改JavaScript行为的方式,并且您的代码可读性因此而受到影响。对于您使用此类&#34;设计&#34;。
  4. 编写的每个函数,此样板文件将成倍增加。
  5. 难以检测的类型 - typeof []将返回'object'而不是&#39; array&#39;就像你可能在想。您将不得不编写大量的角落案例,以确保您正确检测所有类型。 JavaScript不是一种打字语言,因此尝试根据typeof协商行为,因为您的首选检测机制将导致各种令人头疼的问题。所有这些额外的代码意味着更多的错误概率,更多的代码需要维护,软件的整体质量最终会受到影响。
  6. <强>赞成

    1. 本节特意留空
    2. 开发人员经常犯的错误,因为一种语言允许某种思维方式,无论他们提出什么代码,只要它编译/执行,就可以了。

      这是一个非常大的误解,并且经常为什么有经验的开发人员更欣赏/偏爱更严格和更多限制的语言。

      无论如何,祝你好运。