[译]<<Effective TypeScript>>技巧36:用专业的词汇命名type

160 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情

本文的翻译于<<Effective TypeScript>>, 特别感谢!! ps: 本文会用简洁, 易懂的语言描述原书的所有要点. 如果能看懂这文章,将节省许多阅读时间. 如果看不懂,务必给我留言, 我回去修改.

技巧36:用专业的词汇命名type

对于类型,属性和变量,选择好的命名有很多好处:1.能让人理解你代码的意图。2.可以提升你代码的抽象性。

假定你正在建立关于动物的数据库,你为一个动物写了 interface:

interface Animal {
  name: string;
  endangered: boolean;
  habitat: string;
}

const leopard: Animal = {
  name: 'Snow Leopard',
  endangered: false,
  habitat: 'tundra',
};

上面的interface有几个问题:

  1. name定义太宽泛:你想要简称?还是科学命名?还是通俗命名?
  2. endangered 语意不详。endangered的标准不明确
  3. habitat也语意不详
  4. 变量名是:leopard,属性名是:Snow Leopard 。这样的区分有意义吗?

改进版本:

interface Animal {
  commonName: string;
  genus: string;
  species: string;
  status: ConservationStatus;
  climates: KoppenClimate[];
}
type ConservationStatus = 'EX' | 'EW' | 'CR' | 'EN' | 'VU' | 'NT' | 'LC';
type KoppenClimate = |
  'Af' | 'Am' | 'As' | 'Aw' |
  'BSh' | 'BSk' | 'BWh' | 'BWk' |
  'Cfa' | 'Cfb' | 'Cfc'
| 'Csa' | 'Csb' | 'Csc' | 'Cwa' | 'Cwb' | 'Cwc' |
  'Dfa' | 'Dfb' | 'Dfc' | 'Dfd' |
  'Dsa' | 'Dsb' | 'Dsc' | 'Dwa' | 'Dwb' | 'Dwc' | 'Dwd' |
  'EF' | 'ET';
const snowLeopard: Animal = {
  commonName: 'Snow Leopard',
  genus: 'Panthera',
  species: 'Uncia',
  status: 'VU',  // vulnerable
  climates: ['ET', 'EF', 'Dfd'],  // alpine or subalpine
};

做了大量的改进:

  1. name 被替换成更明确的词语:commonNamegenus, 和 species.
  2. endangered 变成了:conservationStatus,用了IUCN最新的分类。
  3. habitat 变成了 climates,同时使用另一种标准的分类法

当你使用第一个版本的type命名,你只能找到代码的作者去了解相关信息。但是该代码的作者,可能已经离职或者忘记了!

第二个版本的命名非常专业,明确。我们对变量,type命名时候,尽量选取专业,广泛接受的词语进行命名。

还有几条规则我们需要注意的:

  • 让区别有意义。对于两个不同的物体,可以用不同的名字进行区分。但是如果同一个物体,尽量用同样的名字
  • 避免使用过于宽泛的词语:data,info,thing,item,object,或者entity。 这些词语含义过于宽泛没有意义,尽量避免,除非在文中有特定含义。
  • 命名要根据它是什么,而不是它包含什么,或者怎么计算的。 例如Directory 比INodeList更好。