关于提高JavaScript代码可靠性的7条建议

这篇文章的作者(我们今天将要翻译的译本)决定与读者分享有关JavaScript的七个建议。正如作者希望的那样,这些建议将有助于编写更可靠的程序。



1.使用工厂功能


如果没有人知道,则工厂函数是返回对象的普通函数(而不是类或构造函数)。这个简单的概念使我们能够利用JavaScript的强大功能来创建强大而可靠的应用程序。

重要的是要知道不使用关键字就可以调用工厂函数new如果使用此关键字给她打电话,她将停止应有的举止。

▍为什么要使用工厂功能?


工厂函数可用于简化实例化对象,而不必绑定到类或关键字new

工厂功能的本质是将它们视为最普通的功能。这意味着它们可用于构造对象,其他功能甚至承诺。即,可以将这些功能进行组合和组合以创建更强大的工厂功能,而这些功能又可以与其他功能或对象组合以创建甚至更高级的工厂功能。工厂功能为程序员提供了无限的可能性。

鉴于以上所述,并将工厂功能的使用与推荐的代码编写方法相结合,这些功能可以成为功能强大且便捷的工具。

这是工厂函数的简单示例:

function createFrog(name) {
  const children = []
  
  return {
    addChild(frog) {
      children.push(frog)
    },
  }
}

const mikeTheFrog = createFrog('mike')

如果您使用工厂功能一段时间,您可能会了解,与构造函数形式的竞争对手相比,工厂功能可以提高代码重用级别。结果,程序员必须编写更少的代码。工厂函数便于重构,因为它们能够返回任意对象,并简化了代码库的工作。

2.编写构造函数时,将方法添加到其原型中


如果您刚开始学习JavaScript,那么使用原型对象在您看来可能会有些新鲜。因此,从一开始就与我同在。

请记住,此技术不适用于课程。类无需程序员费力地将类的方法独立保存在其原型中。

这是一个示例构造函数:

function Frog(name, gender) {
  this.name = name
  this.gender = gender
}

Frog.prototype.leap = function(feet) {
  console.log(`Leaping ${feet}ft into the air`)
}

为什么使用构造Frog.prototype.leap而不是仅leap向构造函数创建的对象编写方法例如,像这样:

function Frog(name, gender) {
  this.name = name
  this.gender = gender
  
  this.leap = function(feet) {
    console.log(`Leaping ${feet}ft into the air`)
  }
}

事实是,如果将方法直接附加到构造函数属性prototype,则意味着该实例将由构造函数创建的对象的所有实例共享。

换句话说,如果您依赖前面的示例,this.leap就会发现在创建对象的多个实例时Frog,每个实例都有自己的method leap。也就是说-将创建此方法的多个副本。在这种情况下,这表明系统资源的使用是不合理的,因为在所有这些对象中,都将存在相同方法的副本,该副本在各处的行为都相同。不必在对象的每个实例中创建此类方法的副本。

结果,这将导致程序性能下降。但这并不难避免。应当注意,属性this.namethis.gender应该以这种形式声明,因为它们必须属于特定的对象。如果我们用真实的青蛙作一个类比,那么它的虚拟表示是使用构造函数描述的Frog,那么事实证明青蛙可以有自己的名字,青蛙具有不同的性别。结果,为了在每个对象中存储有关青蛙的唯一信息,有必要声明对象的属性,以便可以在对象实例级别正确使用它们。

这是在流行的请求包中使用此技术的示例

3.将.type属性添加到要区分的对象。


.type如今,通过非官方协议经常将其添加到对象中的 一种属性已被广泛使用。如果您正在编写React应用程序,那么您可能一直都遇到此属性。特别是-如果您使用Redux

使用这种方法可以很好地展示自己的开发过程,因为它除其他功能外,还可以让您创建自记录代码:

function createSpecies(type, name, gender) {
  if (type === 'frog') {
    return createFrog(name, gender)
  } else if (type === 'human') {
    return createHuman(name, gender)
  } else if (type == undefined) {
    throw new Error('Cannot create a species with an unknown type')
  }
}

const myNewFrog = createSpecies('frog', 'sally', 'female')

4.使用TypeScript


TypeScript已在JavaScript社区中得到广泛应用,原因是该语言为程序员提供了一种安全地处理类型的强大工具,并且还允许您甚至在错误出现在正在运行的代码中之前对其进行识别。

使用TypeScript,即使在启动代码之前,也可以在编译代码的阶段发现潜在的错误。如果代码中有错误,则在编译时将显示编译通知。

但是,在任何情况下使用TypeScript的类型安全性和错误的早期检测都远未完整。TypeScript的一大优点是,它可以让您在新的JavaScript功能出现在主流浏览器之前就加以利用。事实是,TypeScript代码已编译为现代浏览器(而不是最新浏览器)支持的JavaScript代码。

5.编写测试


如果您正在从事一个项目并且对这项工作很认真,那么您实际上需要编写测试。这将使代码更具可预测性,并减少出错的可能性。进行更改时,这将使您对代码的质量有更高的信心。换句话说,如果您希望代码经受住时间的考验,那么没有比编写测试更好的方法来为此测试准备代码了。您在项目中进行的测试越多,将其部署到生产环境中时对代码的信心就越大。

如果仅需要选择一项最重要的正面测试功能,那将是什么?我相信这是事实,即测试有助于发现错误,然后再进入工作程序。什么样的程序员不希望有这样的机会?我当然不会拒绝这样的事情。这就是为什么我要为我的项目编写单元测试。

如果您只是要开始为项目创建测试-请注意,今天有许多用于组织代码测试的工具和框架。这是一些好东西。

6.编写尽可能简单的函数。


众所周知,没有问题的JavaScript允许您创建可立即解决许多任务的庞大函数。

如果您不熟悉编程,那么这对您来说似乎很积极。我要说说自己,在过去,当我编写满足我需要的大量代码时,我感觉很棒。这对我来说很重要。当我看到自己的代码可以毫无问题地工作时,我会感到更加自信,更不用说我能够编写大量功能良好的代码,从而增强了我的自信心。那时我真是天真!

如果您想编写易于维护的代码,简单且不太容易出错的代码,那么最好的选择就是使函数尽可能的简单和小巧。功能越简单,就越容易与系统的其他部分隔离地对其进行测试。

对于那些想要在工作中使用函数式编程原理的人来说,这一点尤其重要。在这方面,我们可以回想一下对功能的一个众所周知的要求:一个功能只能解决一个问题,而它需要很好地解决这个问题。

7.永远记住使用JSON.parse和JSON.stringify时错误处理的重要性


在JavaScript编程中,将JSON数据传递给方法时JSON.parse,有必要考虑以下事实:该方法期望接收正确执行的JSON代码作为第一个参数。如果此方法收到错误的JSON材料,则将引发错误。

这里的危险是,传递JSON.parse不正确的JSON代码会导致应用程序停止。在工作中,我最近遇到一种情况,由于其中一个外部软件包不适合JSON.parse该块,因此我们的一个Web项目引发了错误try/catch。这导致页面失败,直到修复了外部程序包代码,我们才能摆脱该问题。这一切都是由于以下事实而发生的:在代码运行期间,出现了未处理的错误:

SyntaxError: Unexpected token } in JSON at position 107

在处理从外部来源传入应用程序的JSON数据时,人们不能希望它会被正确格式化。您总是需要为它们可能遇见会导致错误的事实做好准备。

摘要


我们希望此处提供的建议可以提高JavaScript代码的可靠性,对您有用。

亲爱的读者们!对于想要编写更好,更可靠的JavaScript代码的人,您有什么建议?

Source: https://habr.com/ru/post/undefined/


All Articles