【问题标题】:Should I declare a variable or access object method? [closed]我应该声明一个变量还是访问对象方法? [关闭]
【发布时间】:2019-06-03 04:41:22
【问题描述】:

哪种做法更好,为什么?

声明一个变量:

exampleFunction(requestData: Object) {
  const username = requestData.username;

  doSomething(username);
}

还是直接访问对象属性?

exampleFunction(requestData: Object) {
  doSomething(requestData.username);
}

如果我使用的代码超过 50 行并且变量被多次使用怎么办。我应该多次使用变量'username'还是多次使用'requestData.username'?

【问题讨论】:

  • 如果您要征求意见:视情况而定,这是一种偏好。
  • 我想知道这些选项中哪一个是更好的做法。
  • 我认为,在上述上下文中,访问对象属性更好。无需声明一个变量来保存它。如果您使用的是更好的 IDE,建议在上述上下文中使用第二个。
  • 我不确定是否有最佳实践,但可以肯定 requestData 太宽泛了。 requestData 包含什么?
  • 我会选择第二个选项。这样干净多了。

标签: angular typescript


【解决方案1】:

第一选择专家:

  1. 可读代码
  2. 您可以在传递给另一个方法之前调试和验证值

第一个选项的缺点:

  1. 它会创建不必要的变量并消耗更多内存

【讨论】:

  • 你永远不应该使用let而不是const
  • 我不好让我更新答案
【解决方案2】:

首先你是referencing 一个对象,而不是克隆它。 正确的克隆方法是通过 Object.assign() 或 lodash(或类似的)_.cloneDeep(),或扩展运算符或其他方法。

有关克隆的更多信息,请参阅typescript - cloning object

回到这个问题,当你有一个单一的变量可以工作时,两者在如此短的方法中具有相同的可读性。

仅仅因为方法太短我更喜欢后一种,因为阅读一行代码可以解释我传递给我的方法的对象的属性,而不是反向阅读代码。

就我自己的口味和一般意见而言,解构是其他程序员对您的代码所期望的最简洁的方式:

const { username, var1, var2 }  = requestData;

【讨论】:

  • 如果他不需要克隆它并且需要引用而不是深度复制对象怎么办?
  • 这是一个小例子。我正在使用的实际代码大约有 60 行代码,其中变量被多次使用。
  • 我指出这一点只是因为代码模拟并不清楚它,并且 cloneFullProject 非常语义化但可能会产生误导
  • 如果变量被多次使用,你可以使用解构,这更清楚:`const {username, var2, var3, var4} = requestData;'
  • 函数名暂时不相关,不知道你是否理解问题。
【解决方案3】:

V8 Javascript Engine 对代码进行一些优化预处理并检查是否可以删除某些变量或代码中是否存在一些规则模式,以减少执行负载。

因此,使用表单或其他表单不存在内存问题,至少使用 V8 引擎(例如,Chrome 或 NodeJS)。

即使不执行此优化,它也只是一个指针或原始变量,因此不会花费超过几个字节。

如果我们谈论传输代码的成本,情况就不同了。我们知道 JavaScript 不是一种编译语言,它需要到达客户端的计算机才能执行,所以每个空格、缩进、分号都会按照用于传输的时间顺序花费。

要降低此成本,您可以丑化和缩小代码,但通常不会执行此类优化。

最后,想出一个可以产生影响的场景是不可能的,所以我建议你使用你认为更易读的形式,而不管其他参数。

【讨论】:

  • 解释得很好!
  • 我认为我的答案需要一些来源,我稍后会添加一些东西
【解决方案4】:

首先,这是一个基于意见的问题。所以,下面给出的答案是我的观点。

  • 在第一种情况下,您需要一个实际上不需要的额外变量,因为您不会在同一块中进一步处理它。因此,我推荐在您的场景中使用 直接属性访问第二个,并且也更具可读性
  • 如果您的实际代码超过 60 行(左右)并且变量在不同的地方多次使用,您可以将 第一种情况an额外的变量,这样您会发现使用较少/安全的输入很容易处理它

【讨论】:

    【解决方案5】:

    通过重构 Martin Fowler 是一种技术 (Replace Temp with Query)。

    之后您将转到第二个变体

    cloneFullProject(requestData: Object) {
      doSomething(requestData.username);
    }
    

    但它也是气味(Middle Man)。

    作为这个例子中的一个结论,最好完全删除这个方法:)

    但是,有些情况下最好是第一个例子。例如: 您有几种方法采用requestData.username 参数。

    exampleFunction(requestData: Object) {
      const username = requestData.username;
    
      doSomething1(username);
      doSomething2(username);
      ...
    }
    

    在这种情况下,临时变量是合理的

    【讨论】:

      猜你喜欢
      • 2017-11-10
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多