网站搜索

typescript - 编码风格 - 关于属性使用的共识


这里有同一个类的两个版本。

1) 使用公共字段:

export class MyClass {
  public field: string;
}

2) 带有getter和setter:

export class MyClass {
  private _field: string;

  public get field() {
    return this._field;
  }

  public set field(field: string) {
    this._field = field;
  }
}

与另一种语言相比:

如果这是一个 Java 或 C# 类——一般的共识是——公共字段(即代码块 1)违反了封装法则。除此之外,在 Java 中,字段在多线程情况下的行为有一些差异。如果你想直接访问一个字段,你可能需要添加 volatile 关键字。

所以,在 Java 和 C# 中,普遍的共识是你在大多数情况下应该编写 getter/setter。(即代码块 2)

在 TypeScript 中,getter/setter 看起来弊大于利:

但我有这种印象,在 Typescript 中实际上可能更好直接将 fields 设为 public。它似乎解决了一些问题:

  • 对于外部类,调用字段或 getter 看起来完全相同(因此,调用 getter 时没有大括号)。
  • 我上面的例子定义了带下划线前缀的字段,这违反了字段的命名规范。
  • 避免可能导致递归循环的错误。get f() { return f; }
  • 显然,更少重复的模板代码:我的大多数 TypeScript 类几乎都是空的(例如,Angular 组件的类)。如果我把所有的 getter/setter 都显式定义,代码量可能会增加三倍。

一些具体问题:

  • 在 TypeScript 社区中,人们对属性的普遍共识是什么?
  • 当所有这些 TypeScript 代码被编译成 JavaScript 时,会不会两段代码实际上都只是生成相同的 JavaScript 代码?

我为什么要问关于风格的问题?——因为我不仅仅是为自己写代码。我还希望其他人能够享受我的代码,而不会因为我违反简单的编码规则而感到烦恼。