【问题标题】:What is the recommended way of passing arguments? [closed]传递参数的推荐方式是什么? [关闭]
【发布时间】:2018-04-21 12:21:08
【问题描述】:

我展示了两种模式:

  • 模式 A:参数先前保存在变量中。

  • 方式B:参数直接传递。

这里我展示2个案例:

案例1:没有串联的参数

//Mode A:
const msg = this.test.fullTitle();
return helper.error(msg, err, done);

//Mode B:
return helper.error(this.test.fullTitle(), err, done);

案例 2: 连接参数

//Mode A:
const msg = this.test.fullTitle() + ' welcome';
return helper.error(msg, err, done);

//Mode B:
return helper.error(this.test.fullTitle() + ' welcome', err, done);

问题:

哪种模式值得推荐、可读、高效还是只是个人风格?

【问题讨论】:

  • 我认为 javascript 不支持开箱即用的名称传递。所以各种传球风格没有区别。此外,字符串在 javascript 中是不可变的。错误函数不可能改变 msg 变量,即使它不是 const。
  • 至于可读性,同样 javascript 不允许命名参数(即f(error="msg")。另一种方法是简单地将对象文字传递给函数。f({error : "msg"})

标签: javascript function parameter-passing


【解决方案1】:

对于案例 2 模式 A:

const fullTitle = this.test.fullTitle();
const msg =  `${fullTitle} welcome`;
return helper.error(msg, err, done);

我想强调的要点是:

  1. 使用“${variableName}”等 es6 功能,而不是使用“+”来联系字符串。
  2. 与其传递一长串参数,不如传递一个对象(在您创建的函数上)。
    • 您创建的任何函数都应接受单个对象。通过这样做,您不必关心必须在函数中传递的参数的顺序。

如果您的辅助函数接受单个对象作为参数,那么它看起来像:

const fullTitle= this.test.fullTitle();
const msg =  `${fullTitle} welcome`;
const err = null;
const done = () => {};
return helper.error({msg, err, done});

您的辅助函数的定义如下所示:

const error = (params) => {
const {msg , err , done  } = params;
//do something here
} 

【讨论】:

  • 现在太冗长了……
【解决方案2】:

代码清晰性不应该由您自己弄清楚。选择一种风格,然后看看它。它看起来清晰易读吗?这种方法有什么问题吗?内联写入值是否会导致该行向右延伸太远?如果是这样,请使用变量或将参数放在单独的行(或每个单独的行)。

所以基本上答案是使用常识并做出决定。

【讨论】:

    【解决方案3】:

    在我看来

    我将使用Parameter without concatenationmode A,因为:

    • 我们可以使用单元测试对其进行测试
    • 易于编写和理解
    • 在复杂情况下,您可以轻松地将代码转换为 Typescript 或其他语言样式

    【讨论】:

    • 这和 TypeScript 有什么关系?两种模式都是有效的 JS,因此也是有效的 TS。
    • 您在这里的单元测试中究竟要测试什么?
    【解决方案4】:

    从效率或性能的角度来看,没有区别。在这两种情况下,函数fullTitle() 将首先被评估,返回的字符串将被传递给error() 函数。连接是一种可能的开销(字符串在 JavaScript 中是不可变的)。但在这些情况下可能可以忽略不计。

    现在,如果您以某种方式在库中实现惰性求值或按名称传递的一种形式,传递样式将产生巨大的影响。

    在我看来,函数的可读性部分与命名参数有关。同样,JavaScript 不支持命名参数。不可能做到error(message="msg")。如果绝对需要这种级别的可读性,可以采用一种将对象字面量传递给函数的方式。

    error({message : "msg"});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 2011-11-05
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多