问与答 对TypeScript的接口和类编码准则感到困惑

norris · 2020-03-03 09:30:44 · 热度: 56

我通读了TypeScript编码指南

我发现这句话令人费解:

不要使用“ I”作为接口名称的前缀

我的意思是,如果没有“ I”前缀,这样的事情就没有多大意义。

class Engine implements IEngine

我是否缺少明显的东西?

我不太了解的另一件事是:

班级

为了保持一致性,请勿在核心编译器管道中使用类。 采用   函数关闭。

那说明我根本不应该使用类吗?

希望有人可以帮我清理一下:)

猜你喜欢:
共收到 4 条回复
skywu #1 · 2020-03-03 09:30:45

当团队/公司交付框架/编译器/工具集时,他们已经具有一些经验和最佳实践。 他们将其作为准则。 准则是建议。 如果您不喜欢,可以忽略它们。编译器仍然会编译您的代码。虽然在罗马...

这就是我的愿景,为什么TypeScript团队不建议使用I前缀接口。

原因#1匈牙利符号的时代已经过去

I-prefix-for-interface支持者的主要观点是,前缀有助于立即查看(窥视)类型是否为接口。前缀有助于立即进行(偷看)的声明吸引了匈牙利表示法。接口名称的前缀Car implements ICar,类的前缀FileBasedAutosuggestManager implements AutosuggestManager,抽象类的前缀27557984176570378378,字符串变量的变量SportsCar, SuvCar, HollowCar,常量变量的变量c,整数变量的变量i。我同意这种名称修饰可以为您提供键入信息,而无需将鼠标悬停在标识符上方或通过热键导航到类型定义。匈牙利符号缺点和下面提到的其他原因超过了这一微小的好处。匈牙利符号未在当代框架中使用。由于历史原因(COM),C#的接口前缀为I(这是C#中唯一的前缀)。回顾一下,.NET架构师之一(Brad Abrams)认为最好不要使用Car implements ICar前缀。 TypeScript不具有COM传统功能,因此它没有I接口前缀规则。

原因#2 Car implements ICar-前缀违反了封装原理

假设您有一些黑匣子。 您将获得一些类型引用,该引用可让您与该框进行交互。 您不必关心它是接口还是类。 您只需使用其界面部分。 要求知道它是什么(接口,特定实现或抽象类)违反了封装。

示例:假设您需要在代码中修复API设计误区:接口作为合同,例如 删除Car implements ICar接口并改用FileBasedAutosuggestManager implements AutosuggestManager基类。 然后,您需要在所有使用者中执行此类替换。 Car前缀导致使用者对黑盒实现细节的隐式依赖。

原因#3防止命名错误

开发人员懒于正确考虑名称。 命名是计算机科学中的两大难题之一。 当开发人员需要提取接口时,只需在类名中添加字母Car implements ICar即可,您将获得一个接口名。 不允许为接口添加FileBasedAutosuggestManager implements AutosuggestManager前缀,这会迫使开发人员竭尽全力为接口选择合适的名称。 选择的名称不仅应在前缀上不同,而且应强调意图差异。

抽象情况:不应定义Car implements ICar接口和关联的FileBasedAutosuggestManager implements AutosuggestManager类。 Car是一种抽象,应该是用于合同的一种。 实现应具有描述性的独特名称,例如 SportsCar, SuvCar, HollowCar

范例:Car implements ICarFileBasedAutosuggestManager implements AutosuggestManager

错误示例:Car implements ICar

原因#4正确选择的名称会给您接种API设计误区:接口即合同。

在我的实践中,我遇到了很多人,他们在一个具有Car implements ICar24命名方案的单独接口中,无意中重复了类的接口部分。 在单独的接口类型中复制类的接口部分不会神奇地将其转换为抽象。 您仍将获得具体的实现,但是接口部分重复。 如果您的抽象效果不是很好,那么复制接口部分将无法改善它。 提取抽象是艰苦的工作。

randell #2 · 2020-03-03 09:30:46

关于您引用的链接的说明:

这是有关TypeScript代码样式的文档,而不是有关如何实现项目的样式指南。

如果使用SomeThing前缀对您和您的团队有意义,请使用它(我愿意)。

如果不是这样,也许SomeThing(接口)和SomeThingImpl(实现)的Java风格都可以使用。

augus #3 · 2020-03-03 09:30:47

作为接口的类型是实现细节。 实现细节应隐藏在API:s中。 这就是为什么您应该避免CarImpl

您应该避免使用bot CarImpl和27558003862620082008。这两个都是错误的:

  • CarImpl
  • CarImpl

您应该做的是在API中显示一个漂亮的名称,并在实现中隐藏一个实现细节。 这就是为什么我建议:

  • CarImpl-API中公开的接口。
  • CarImpl-对使用者隐藏的该API的实现。
teikari #4 · 2020-03-03 09:30:48

TypeScript的手册说明了一切。 只要注意那里的例子就可以了。 <3

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册