一起养成写作习惯!这是我参与「掘金日新计划 · 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有几个问题:
- name定义太宽泛:你想要简称?还是科学命名?还是通俗命名?
- endangered 语意不详。endangered的标准不明确
- habitat也语意不详
- 变量名是: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
};
做了大量的改进:
- name 被替换成更明确的词语:
commonName,genus, 和species. - endangered 变成了:conservationStatus,用了IUCN最新的分类。
- habitat 变成了 climates,同时使用另一种标准的分类法
当你使用第一个版本的type命名,你只能找到代码的作者去了解相关信息。但是该代码的作者,可能已经离职或者忘记了!
第二个版本的命名非常专业,明确。我们对变量,type命名时候,尽量选取专业,广泛接受的词语进行命名。
还有几条规则我们需要注意的:
- 让区别有意义。对于两个不同的物体,可以用不同的名字进行区分。但是如果同一个物体,尽量用同样的名字
- 避免使用过于宽泛的词语:data,info,thing,item,object,或者entity。 这些词语含义过于宽泛没有意义,尽量避免,除非在文中有特定含义。
- 命名要根据它是什么,而不是它包含什么,或者怎么计算的。 例如Directory 比INodeList更好。