编写软件很难。 只有少数方法可以做到正确,有很多方法可以做到错误,使我们的生活更加艰难。
在本文中,我们将通过一些代码气味来探讨编写不良代码的一些方法。
具有不同接口的替代类
由于重复,两个功能相同但接口不同的类并不好。
我们不想那样。 因此,我们可能要使用共享代码创建一个超类,然后使子类具有不同的方法。
库类不完整
重用并没有被高估。
图书馆建设者的工作艰巨。 他们可能会开设不完整的课程,但不允许我们修改它们以完成我们希望他们做的事情。
因此,这使库类对我们毫无用处,除非我们可以添加所需的功能。
我们可能必须直接向这些类添加新方法来解决此问题。
例如,如果我们导入了一个类,则可以通过编写以下代码来添加自己的方法:
- const mixin = {
- foo() {
- //...
- },
- bar() {
- //...
- }
- }
- Object.assign(Foo.prototype, mixin);
在上面的代码中,我们将Foo类的原型中的代码与mixin对象中的方法合并,以使用Object.assign方法将更多方法合并到该类中。
数据类型
数据类是仅具有字段的类。
这些类可能被其他类过多地操作。
因此,如果所有公开领域都公开了,我们应该封装它们。
如果需要,我们还可以封装收集字段。
为了封装它们,我们可以将字段设为私有,并添加访问和设置它们的方法。
拒绝继承
子类继承父类可以访问它们的方法。
如果我们不需要父类中的这些类,则可以将它们下推到子类中。
然后,并不是所有的子类都将从父类继承方法,而它们仍然可以留在需要它们的子类中。
注释
评论对某些事情很有用。 我们可以评论为什么要执行某项操作,但是由于我们已经在代码中进行了操作,因此无需在评论中说明我们如何执行操作。
还注释代码是不好的。 首先,我们应该把它们带走,因为它们没有运行。
不属于自己的条件
我们应该将条件语句分成自己的一行,以便我们可以更轻松地阅读它们。
所以不用写:
- if (foo) {
- //...
- } if (bar) {
- //...
- }
我们写:
- if (foo) {
- //...
- }
- if (bar) {
- //...
- }
注释可选参数
可选参数在JavaScript中应具有默认值。 例如,我们可以编写以下代码来指示参数是可选的:
- const foo = (a = 1) => {
- //...
- }
> Photo by Samantha Gades on Unsplash
当心"死存储"
死存储是指我们为变量分配值,但不使用原始值就重新分配了值。
因此,我们实际上并不需要原始值,因此可以删除该行。
所以不用写:
- let x = 1;
- x = 8 * 10;
我们写:
- let x = 8 * 10;
不要反转我们的布尔值
双否定总是比直接条件表达式更难读。
因此,我们应该以更直接的方式编写是可能的。 例如,而不是写:
- if (!(x > 10)) {
- //...
- }
我们写:
- if (x <= 10) {
- //...
- }
如我们所见,第二条if语句比第一条if语句更易于阅读,并且更短。 他们都是一样的。
使用模板字符串
模板字符串是最好的JavaScript字符串。 我们可以在其中插入表达式,而其他任何类型的字符串都无法做到。
另外,我们可以通过在字符串中输入换行符来创建多行字符串。
由于反引号用作模板字符串的定界符,因此可以在字符串内部使用引号而不转义它们。
结论
模板字符串很棒。 它们使我们可以做更多旧式弦弦无法完成的事情。
要向不完整的库类添加更多方法,我们可以使用Object.assign向它们添加自己的方法。
另外,我们需要封装数据类,以使您的代码不会与数据类紧密耦合。