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