随着Typescript变得热,越来越多的人开始使用Typescript。同时,原始的JavaScript编码样式不能完全应用于打字稿。
本文修改了一些中文版本,例如,等等。
2019年1月,TypesCirlpt正式决定将ESLINT用作代码检查的工具,并创建了一个新的Project typecript-eslint,为Typescript File@typescript-eslint/parser@typecript-eslint/eslint-eslint/eslint-plugin提供了解析器,等等。前两个棉绒解决方案将被放弃:
中文|英语
将干净代码的概念应用于typeScript,灵感来自Clean-ode-javaScript。
这不是打字稿编码样式规范,而是罗伯特·马丁(Robert C.
实际上,并非必须严格观察到每个原则,并且可以广泛认可的原则更少。尽管这似乎只是指导原则,但干净的代码作者凝结了多年的编程经验。
软件工程技术拥有超过50年的历史,我们仍然必须学习很多。当软件体系结构和体系结构本身是旧的,我们可能需要遵守更严格的规则。但是现在,让这些指导原则使用作为评估您和团队代码质量的测试金石。
此外,理解这些原则不会立即使您出色,也不意味着您不会犯错误。每个代码从越来越多,并且通过重复调查而继续是完美的,就像粘土对陶瓷制作一样,享受这一点,过程!
计算机科学中只有两个问题:缓存失败和命名。——菲尔·卡里顿
做有意义的区别使读者更容易理解变量的含义。
?与示例相反:
?积极的例子:
如果您无法正确阅读,那么在讨论它时,您听起来像个白痴。
?与示例相反:
?积极的例子:
?与示例相反:
?积极的例子:
通常,我们不仅要读取代码,因此对于可读性和搜索而言非常重要。如果您不提取和命名有意义的变量名称,那么阅读代码的人就可以易于搜索。代码必须易于搜索,而TSLINT可以帮助识别未命名的常数。
?与示例相反:
?积极的例子:
?与示例相反:
?积极的例子:
不要让人们猜测或想象变量的含义,很明显它是国王。
?与示例相反:
?积极的例子:
如果类名称或对象名称已表示某些信息,请不要在内部变量名称中重复该表达式。
?与示例相反:
?积极的例子:
通常,默认参数比短路更干净。
?与示例相反:
?积极的例子:
限制参数的数量,以使函数测试更容易。超过三个参数会导致测试复杂性激增,并且需要测试许多不同参数的组合。理想地,只有一个或两个参数。如果有两个以上的参数,您的功能可能太复杂了。
如果您需要大量参数,请考虑使用对象。为了使函数的函数更清晰,可以解构。它具有以下优势:
?与示例相反:
?积极的例子:
通过打字稿类型的别名,可以进一步提高可读性。
这是软件工程中最重要的规则。如果该功能可以做不止一件事,那么组合,测试和理解更困难。相反,仅一个功能的行为,它更容易重建,并且代码更清晰。如果您能做得很好,那么您一定很棒!
?与示例相反:
?积极的例子:
您可以看到由函数名称实现的函数。
?与示例相反:
?积极的例子:
当有多个抽象级别时,该函数应该做得太多。可以重复使用拆分函数,从而更容易测试。
?与示例相反:
?积极的例子:
重复是所有邪恶的来源!重复意味着如果要修改某个逻辑,则需要修改多个代码?想象一下,如果您经营餐厅,则必须记录您的库存:所有西红柿,洋葱,大蒜,香料,等等,要保持多个库存清单是多么痛苦!
有一个重复的代码,因为有两个或多个相似的功能,只有一个点,但是这种差异迫使您使用多个独立函数做了许多几乎相同的事情。删除重复代码意味着创建抽象。抽象只能使用一个功能/模块/类处理这组不同的事物。
合理的抽象至关重要,这就是为什么您应该遵循的原因。不良抽象可能不是重复的代码,所以请小心!说,仍然是抽象的!请不要重复。
?与示例相反:
?积极的例子:
有时,在重复的代码和不必要的抽象的复杂性和增加的复杂性之间,称重。当来自不同字段的两个不同模块时,它们的实现看起来相似,复制是可以接受的,并且比绘制公共代码更好。导致两个模块具有间接依赖性。
?与示例相反:
?积极的例子:
或者,您可以使用默认值解构:
为了避免副作用,不允许表达或价值。查看Typescript编译器的选项。
FLAG参数告诉用户此函数不止一件事。如果函数使用布尔值来实现不同的代码逻辑路径,请考虑将其拆分。
?与示例相反:
?积极的例子:
当功能生成行为时,除了“输入和输出”,该功能称为副作用。例如,写文件,修改全局变量或将钱转移到陌生人。
在某些情况下,该程序需要一些副作用。不要修改具有多个功能/类的文件。仅使用一个服务来完成此需求。
关键是要避免使用可变数据类型和不确定副作用的位置之间的共同陷阱,例如在没有结构对象之间共享状态。如果可以做到这一点,您可以笑!
?与示例相反:
?积极的例子:
在JavaScript中,原始类型为值传输,对象和数组是参考传输。
在这种情况下,如果您的功能修改了购物车阵列以添加购买的商品,则使用此阵列的其他功能将受到此添加操作的影响。想象不良情况:
用户单击“购买”按钮,按钮调用函数,函数请求网络并将数组发送到服务器。到差的网络连接,必须连续请求购买功能。请求,用户意外单击了某个项目的“添加到购物车”按钮。我该怎么办?目前,网络请求开始,因此该功能会发送出意外添加的项目,因为它引用了购物车数组,该功能会修改数组并添加不必要的项目。
始终将一个好的解决方案克隆,编辑并返回克隆。这确保购物车的其他功能不会受到任何更改的影响。
注意两点:
?与示例相反:
?积极的例子:
JavaScript中污染的总体实践非常糟糕,这可能会导致其他图书馆冲突。在实际环境中获得例外之前,请致电您的API以获取这种情况。
考虑一个这样的例子:如果您想扩展JavaScript并使其具有可以显示两个阵列之间差异的方法,我该怎么办?可以编写新功能,但它可能与同一事物的另一个试验相冲突。如果另一个库仅用于查找数组的第一个元素和最后一个元素之间的区别?
一种更好的方法是扩展以实现相应的功能。
?与示例相反:
?积极的例子:
尝试使用功能编程!
?与示例相反:
?积极的例子:
?与示例相反:
?积极的例子:
?与示例相反:
?积极的例子:
这似乎不太可能做到。大多数人的第一个反应是:“如果没有陈述,我该如何拥有该功能?”在大多数情况下,可以使用相同的功能来实现相同的功能。下一个问题是“为什么要这样做?”
?与示例相反:
?积极的例子:
Typescript是JavaScript的严格语法重叠,它具有静态类型检查的特征。因此,指定变量,参数和返回值的类型使该功能充分利用此功能可以使重建更加容易。
?与示例相反:
?积极的例子:
现代浏览器在运行时执行许多基础优化。许多时代,您只是在浪费时间。一些优质的资源可以帮助定位在哪里进行优化,查找和维修。
?与示例相反:
?积极的例子:
无需保留无用的代码和重复的代码。如果没有地方可以调用它,请删除它!如果您仍然需要它,则可以查看版本的历史记录。
?与示例相反:
?积极的例子:
当像流一样处理数据集时,请使用生成器和迭代器。
原因如下:
?与示例相反:
?积极的例子:
一些库可以处理类似于“映射”,“ slice”,“ foreach”和其他方法的方式类似的迭代。请参见Itiriri中一些高级操作示例(或异步操作Itiriri-Async)。
TypeScript支持Getter/Setter语法。使用Getter和setter访问属性,而不是简单地从对象搜索数据。原因如下:
?与示例相反:
?积极的例子:
Typescript类成员支持(默认)和访问限制。
?与示例相反:
?积极的例子:
Typescript类型系统允许在类上设置接口和单个属性仅读取,并且可以在函数中运行。
还有一个高级别的场景,可以使用-in -In类型。它接受T型并使用映射类型仅将其所有属性标记为仅。
?与示例相反:
?积极的例子:
可能需要组合或交叉点时,请使用类型。如果需要或使用接口。但是,没有严格的规则,只有合适的规则。
对打字稿中立性和差异之间差异的答案的详细说明。
?与示例相反:
?积极的例子:
班级的大小是通过其责任来衡量的。根据单个责任的原则,该类别应该很小。
?与示例相反:
?积极的例子:
内部收集:定义成员之间的相互关系程度。理想地,高端集群的每种方法都应使用类中的所有字段,这实际上是不可能的。但是我们仍然倡导Gao Nei。
耦合:它是指两个类之间的相关程度。如果其中一个的变化不影响另一个类,则称为低耦合类。
良好的软件设计具有很高的内部聚合和低耦合。
?与示例相反:
?积极的例子:
正如“四个帮派”在设计模式下指出的那样,您可以尽可能多地使用该组合而不是继承。组合和继承具有自己的优势和缺点。该准则的要点是,如果您潜意识地倾向于倾向于潜意识继承,尝试在某些情况下考虑组合是否可以更好地建模您。
我什么时候应该使用继承?这取决于您面临的问题。以下情况更好地继承:
?与示例相反:
?积极的例子:
在许多库中都可以看到非常有用的模型。它使代码表达式更好,更简单。
?与示例相反:
?积极的例子:
正如干净的代码中所述,“更改的原因不应超过一个。”班级包装很多功能看起来很有吸引力,就像您只能在飞行中携带一个盒子。没有内部的团聚,并且有很多理由修改类。我们应该尝试最大程度地减少更改的数量。如果类具有太多功能,则很难确定对其他依赖模块之一的影响代码库。
?与示例相反:
?积极的例子:
正如贝特兰·迈耶(Bertrand Meyer)所说:“应该扩展和关闭软件实体(类,模块,功能等)。”换句话说,允许新功能添加新代码而不更改现有代码。
?与示例相反:
?积极的例子:
对于一个非常简单的概念来说,这是一个可怕的术语。
它的形式定义是:“如果s是t的子类型,则可以将类型t的对象替换为类型s的对象,而无需更改任何期望(正确,执行任务等)。一个更可怕的定义。
一个更好的解释是,如果您有父母课程和子类,则可以在没有问题的情况下使用父级和子类。这可能仍然令人困惑,所以让我们看经典的正方形矩形。但是,如果您通过继承“ IS-A”关系的使用来对其进行建模,那么您很快就会遇到麻烦。
?与示例相反:
?积极的例子:
“不应强迫客户依靠他们不使用的界面。”该原则与单个责任的原则密切相关。这意味着应该设计大型且全面的抽象,否则它将增加客户的负担,因为他们需要实现一些不必要的方法。
?与示例相反:
?积极的例子:
该原则有两点:
一开始很难理解,但是如果您使用了Angular,您会看到这些依赖注入的原则(di)。尽管该概念是不同的,但DIP会阻止高级别的模块理解其低级别的细节模块和设置。它可以通过di。这是巨大的好处是减少模块之间的耦合。耦合非常糟糕,这使得代码很难调和。
通常通过使用控制逆转(IOC)容器来实现倾斜
?与示例相反:
?积极的例子:
测试比发布更重要。如果没有测试或测试,则不能确保每次发布代码时都不会引入问题。如何将其视为足够的测试?这取决于团队,但是,有了100%的覆盖范围(所有声明和分支机构)将使团队更加自信。所有这些都必须基于一个良好的测试框架和覆盖范围工具。
没有理由不编写测试。。关键是要确保在开发现有特征的任何特征或重建之前,代码覆盖范围已经达到。
整理测试应遵循以下标准:
测试还应遵循单个职责的原则,每个单位测试只有一个主张。
?与示例相反:
?积极的例子:
当测试失败时,错误的第一个迹象可能是其名称。
?与示例相反:
?积极的例子:
不整洁的后退调整和太多的嵌套(回调地狱)。
一些工具使用回调方法将现有函数转换为Promise对象:
?与示例相反:
?积极的例子:
承诺提供了一些辅助方法,使代码更加简洁:
返回价值中解析的诺言。归还给拒绝的承诺。归还新的诺言,每个诺言传递到阵列中以完成诺言,或者第一个诺言拒绝和拒绝。返回新的诺言,一个在数组求解或拒绝中传递的承诺,将解决或拒绝返回的承诺。在运行任务时,它特别有用,使承诺更容易实现超时。
使用/语法,您可以编写更简洁,更容易理解的链链代码。A函数将关键字作为前缀,JavaScript在运行时(使用Promise)在关键字上运行代码执行。
?与示例相反:
?积极的例子:
投掷错误是一件好事!它表明它在运行过程中已经成功识别了程序中的错误。通过停止当前堆栈的功能,终止过程(以node.js为单位)并在控制台中打印堆栈信息以让您知道。
JavaScript和TypeScript允许您允许任何对象。启示也可以以任何原因拒绝它。
建议使用类型的语法。由于您的错误可能会在带有语法的高级代码中捕获。字符串的混乱非常混乱,会使调试更加痛苦。出于相同的原因,该类型也应该是拒绝承诺时使用。
?与示例相反:
?积极的例子:
使用该类型的优点是语法支持它,并且所有错误都具有隐式类型中的属性,这对于调试非常有用。
此外,即使您不使用语法,但返回自定义错误对象,对于此部分而言,Typescript也更容易。请介绍以下示例:
有关详细信息,请参阅原始文本。
捕获错误和不处理错误实际上没有修复,并且错误记录了错误的错误。如果代码写在其中,则可能发生在此处,因此您应该考虑在发生错误时进行一些处理。
?与示例相反:
?积极的例子:
原因与中间被忽略的原因相同。
?与示例相反:
?积极的例子:
就像这里的许多规则一样,没有艰难的规则,也没有格式化。重点不是争论格式和格式化自动化工具。对于工程师来说,争议格式是浪费时间和金钱。一般原则是维护一致的格式规则。
2019年1月,TypesCirlpt正式决定将ESLINT用作代码检查的工具,并创建了一个新的Project typecript-eslint,为Typescript File@typescript-eslint/parser@typecript-eslint/eslint-eslint/eslint-plugin提供了解析器,等等。
参考配置
您还可以参考“打字稿样式指南”和“源代码达成协议”。
资本可以告诉您很多有关变量,功能等的信息。这些都是主观规则,并且选择了团队。关键是,无论您选择如何,您都必须保持一致。
?与示例相反:
?积极的例子:
类名称,接口名称,类型名称和命名空间名称最好使用“ Pascar命名”。
变量,功能和类成员使用“驼峰命名”。
当函数互相调用时,应将两者靠近。最好将呼叫者写在该人之上。这就像阅读报纸一样。我们都从上到下阅读,因此请阅读代码。
?与示例相反:
?积极的例子:
使用整洁且易于阅读,您可以快速查看当前代码的依赖性。简介语句应遵循以下方法:
?与示例相反:
?积极的例子:
为了创建一个干净而美丽的导入语句,可以在中间设置编译器选项和属性。
这可以避免导入时使用较长的相对路径。
?与示例相反:
?积极的例子:
编写评论意味着没有注释就无法表示,最好使用代码表达它。
不要对不良代码发表评论,重写它! - Brian W。Kernighan和P. J. Plaugher
代码是文档。
?与示例相反:
?积极的例子:
该版本存在的原因之一是使旧代码成为历史记录。
?与示例相反:
?积极的例子:
请记住,使用版本控制!无需保留无用的代码和注释,尤其是日记等评论,以获取历史记录。
?与示例相反:
?积极的例子:
它们经常干扰代码。要使代码结构,功能和变量必须具有合适的凹痕和格式。
此外,您可以使用支持代码折叠的IDE(请参阅Visual Studio代码折叠)。
?与示例相反:
?积极的例子:
当您发现需要在代码中发表评论以提醒后续改进时,使用注释。大多数IDE为此类注释提供了特殊的支持,并且您可以快速浏览整个列表。
VSCODE可以使用托多光
但是,请记住,Todo评论不是不良代码的借口。
?与示例相反:
?积极的例子:
原始:https://juejin.cn/post/709635898198190111
