如何避免典型的“动态语言错误”?


42

我最近在JavaScript中投入了几个小时,因为我想从庞大的用户群中受益。这样做时,我注意到大多数人都将其归因于动态语言。您可以使事情真正快速地工作,但是一旦代码达到一定的大小,通常会浪费大量时间进行类型,拼写和重构错误。错误通常会使我免于编译器的困扰。当我在另一个模块中输入错字时,不必让我寻找逻辑错误。

考虑到以下令人难以置信的JavaScript和其他动态类型语言使我相信我的方法有问题。还是这仅仅是您必须支付的价格?

简而言之:

  • 您如何使用〜2000 LOC处理JavaScript(或其他动态语言)项目?
  • 有没有工具可以防止我犯这些错误?我已经尝试了Facebook和JSHint的流程,这对您有所帮助,但请不要输入错字。

2
即使有减轻成本的方法,成本
dcastro,

29
我会尝试使用可编译为javascript的静态类型语言编写您的程序,例如Typescript,Scala.js或Elm。
dcastro,

6
测试,测试,更多测试和覆盖率报告。
njzk2

7
〜2000 LOC是一个小项目。它应该轻松地适应动态语言轻松,良好地完成的工作。如果您正在为这种规模的项目而苦苦挣扎,那么您的编程技能就会遇到比与动态语言特别相关的任何问题更为根本的问题。
杰克·艾德利

5
@JackAidley不赞成。OP用于关注高级问题,而不关注标识符的拼写是否正确。那是编程技巧。确保正确的拼写可以由中级学生和/或工具支持人员完成。
mucaho

Answers:


37

具体来说讲JavaScript,可以改用TypeScript。它提供了您所指的一些东西。报价网站:

类型使JavaScript开发人员可以在开发JavaScript应用程序时使用高效的开发工具和做法,例如静态检查和代码重构。

它只是JS的超集,这意味着您现有的一些代码可以与TS很好地配合使用:

TypeScript从当今数百万JavaScript开发人员所知道的相同语法和语义开始。使用现有的JavaScript代码,合并流行的JavaScript库,并从JavaScript调用TypeScript代码。


11
...和打字稿基本上是ECMAScript的6
罗伯特·哈维

11
嗯,那句话很伤人。它只是表明Microsoft一直是静态语言公司,根本不了解动态语言。“类型启用...代码重构”?真?Microsoft的PR部门是否意识到代码重构作为一种惯例是在Smalltalk(一种动态语言)中发明的,甚至早在Forth(一种无类型语言)中就已经存在?在静态语言甚至没有 IDE 之前,第一个自动重构工具是Smalltalk IDE的一部分吗?现代的Smalltalk IDE是否具有重构工具,至少至少具有与Java,C#和C ++一样强大的功能?拜托
约尔格W¯¯米塔格

5
TypeScript本身就是一种很棒的语言,为什么您必须尝试用这种废话推销它?
约尔格W¯¯米塔格

29
@约尔格我不知道有足够的了解Smalltalk中,但对JavaScript或Python我的每一个IDE所看到的是英里的背后有什么好的IDE为Java或C#可以做。还有一些动态语言根本无法做到的事情(实际上是一些最受欢迎的重构):假设您具有公共功能foo(x) { return x.bar;}或类似功能。由于没有类型信息,并且该函数是公共的(因此您不知道所有调用者),因此如果您重命名某个类,就无法弄清楚bar是否应重命名为baz。
Voo

10
这个答案说,解决“动态语言错误”的方法根本就是不使用动态语言。
bgusach '16

19

有一些方法可以帮助您:

单元测试

尽可能编写单元测试。仅仅依靠手动测试或在野外发现错误是一击而败的。

使用框架

不要自己动手并冒险引入错误,请尽可能使用已建立的框架。

偏好CSS /高级语言

您可以在其中将功能转换为CSS或您正在编写的任何高级语言。

重构

重构以减少代码量。更少的代码=更少的出错地方。

重用

重用现有代码。即使代码不完全匹配,也可以复制,粘贴和修改而不是重新编写代码。

集成开发环境

现代IDE通常至少具有一些Javascript支持。一些文本编辑器也支持Javascript。


5
的确,您的建议基本上适用于每种编程语言,并且主要针对解决逻辑错误,而不是动态语言引起的错误。
edmz's

1
“您的建议基本上适用于每种编程语言”。非常正确-以类似的方式从业余项目发展为全面的企业解决方案,这需要越来越多的严格要求,类似地-编写的Javascript越多,如果车轮不运转,则需要的纪律就越多迅速脱落。埃里克·利珀特Eric Lippert)对此做了很好的描述。
罗比·迪

4
“更喜欢CSS /高级语言” —我真的不明白这对JavaScript意味着什么:您是说要将元素(例如动画)移动到样式表中,而不是JS代码中?CSS与高级语言有何关系?
anotherdave

@anotherdave现在可以在CSS3中实现许多曾经牢固地成为Javascript领域的东西。某些功能也可能会转移到更高级别的语言,这将受到更严格的控制。
罗比·迪

4
@anotherdave人们尝试使用JavaScript进行的很多操作都是无关紧要的。提供标准语言工具的库,提供更多标准HTML元素的框架,复制锚,MVC仿真,样式,DOM重新实现,AJAX抽象,呈现琐碎对象(重新实现SVG),填充特性等基本功能的代码使用户受益……您应该减少编写的JS数量。如果没有JS就可以做到,没有JS就可以做到。
bjb568 '16

2

尚未提及的一种工具是简单的文件本地或项目范围内的文本搜索

听起来很简单,但是当您包含一些正则表达式时,您可以进行一些基本的高级过滤,例如搜索文档或源代码中的单词。

它对我来说是一个有效的工具(除静态分析器外),并且鉴于您的项目规模为2k LOC(我认为这并不是特别大),因此有望产生奇迹。


2
grep走很长的路要走。除非您不对动态事物做得太怪异,否则它会成功。但是,如果您习惯使用IDE作为静态类型化语言的话,感觉会非常手动。
bgusach '16

1

我目前在一个大型AngularJS项目上重构数千行代码。最大的麻烦之一是找出给定功能的确切约定。有时,我最终会阅读API文档,因为原始API响应的元素已分配给经过6层代码的变量,然后才被修改并通过6层以上的代码返回。

我的第一个建议是按合同设计。接受特定的输入,产生特定的输出,避免产生副作用,并使用TypeScript或至少使用JSDoc记录这些期望。

我的第二个建议是实施尽可能多的检查。我们遵循AirBnB标准,并在整个代码库中使用eslint。提交钩子验证我们始终遵循标准。我们自然有大量的单元测试和验收测试,所有提交都必须经过同行的审查。

从文本编辑器(Sublime Text)切换到适当的IDE(WebStorm)也使使用代码变得更加容易。如果您提供错误的类型或以错误的方式使用返回值,WebStorm将使用JSDoc给出有关预期参数类型的提示,并引发错误。

在JavaScript中,符号和getter / setter等新功能可以通过在变量分配中添加断言来帮助提高质量水平(例如,确保整数在范围内,或者数据对象具有某些属性)。

不幸的是,我认为没有真正的解决方案来防止动态语言错误,只有一系列措施可以帮助减少它们的发生频率。


0

我对以下问题的回答:“您如何以大约2000 LOC的方式处理JavaScript(或其他动态语言)项目?”

我开发PDF表单应用程序。我使用Petri的net元素和注释来进行我的JavaScript软件开发项目(无论源代码大小如何)。该方法不依赖于任何特定的编程语言技术。因此,它可以用于其他“编程语言”。

我创建了应用程序逻辑图。为了使图表整洁,我将大多数注释添加到与图表一起使用的表单中。表单中的条目包括对属性或功能的引用。然后,根据图表中的信息和表格中的条目写出源代码。该方法是系统的,因为编写的每个源代码都直接从图中和表单中的条目进行映射。可以轻松地检查源代码,因为在编写代码时我也遵循命名和编码约定。

例如,我选择了一个约定,即所有功能都是原型。如果性能成为问题,则可以通过在构造函数中声明函数来改善性能。对于某些属性,我使用数组。同样,如果性能成为问题,则可以使用直接引用进行改进。

我也使用eval。这样可以大大减少源代码的大小。由于性能问题,我在应用程序的开始或初始化部分使用了eval;我从不在“运行时逻辑”中使用它–这是我遵循的另一种编码约定。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.