Javascript 如何在咖啡脚本中变得高效?

Javascript 如何在咖啡脚本中变得高效?,javascript,coffeescript,Javascript,Coffeescript,我想改进我的Coffeescript编码风格。当我用Scala编程时,我可以在一两个小时内编写一个模块,运行它,并且只有几个小错误,我可以快速识别和修复 在Coffeescript中,我花了大约相同的时间在前端,但我最终遇到了数量惊人的小bug,这些bug可能会被静态类型检查器捕获,我最终不得不编译、重新加载浏览器、逐步完成一些代码、添加一些断点等。这是一种令人恼火的体验,需要花费的时间要长得多 由于缺少接口和许多其他OO特性,抽象和封装功能要困难得多 是否有设计模式取代了OO通常提供的封装/抽

我想改进我的Coffeescript编码风格。当我用Scala编程时,我可以在一两个小时内编写一个模块,运行它,并且只有几个小错误,我可以快速识别和修复

在Coffeescript中,我花了大约相同的时间在前端,但我最终遇到了数量惊人的小bug,这些bug可能会被静态类型检查器捕获,我最终不得不编译、重新加载浏览器、逐步完成一些代码、添加一些断点等。这是一种令人恼火的体验,需要花费的时间要长得多

由于缺少接口和许多其他OO特性,抽象和封装功能要困难得多

是否有设计模式取代了OO通常提供的封装/抽象?或者,是否有一本入门/指南,介绍如何以一种更加咖啡式的方式思考问题(或者如何使用原型方法解决问题)


你做了什么来提高Coffeescript(或Javascript,甚至可能是任何动态类型语言)的效率?

如果你来自Java或Scala等静态类型、以类为中心的语言,学习Javascript/Coffeescript将是一个挑战。编译器几乎帮不了你多少忙,这意味着你需要几分钟来发现小错误,而不是几秒钟


如果这是您的主要瓶颈,那么我建议采用一种更为测试驱动的编码方法。使用类似于为您开发的每一项功能编写小测试的库。如果使用得当,这种风格可以提供与静态编译器相同的好处,而不会影响动态语言的灵活性。

不要直接使用Coffee脚本。学习prototype和Javascript OO的核心概念。IMMO您可以同时学习这两种语言,但如果您先学习Vanilla Javascript,您将受益更多。根据我个人的经验,如果您不理解原型继承(很容易陷入bug),那么类的咖啡脚本语法糖可能是一个陷阱


就工具而言,Coffee脚本调试仍然不是一个完全可以解决的问题,我知道唯一可以完成它的方法就是编写测试(刚开始时很痛苦)或查看生成的代码(至少对于更模糊的bug是这样)。

这对我来说也很奇怪;在我的例子中,我来自C/C++背景

对我来说,通过对工作环境进行一些调整,可以显著减少迭代时间。这样做的目的是减少代码量,使您可以编写小块代码,并非常频繁地测试代码

关于缺少编译时检查:你会习惯的。与重要的空白一样,编译时类型检查的缺失在几周后就会消失。很难说到底是怎么回事,但至少我可以告诉你,这确实发生在我身上

关于缺少接口:这是一个棘手的问题。在更大的系统中获得更多的帮助来提醒您实现整个接口将是一件好事。如果您发现确实为此损失了很多时间,您可以编写自己的运行时检查,并在适当的地方插入它们。例如,如果您向中央管理器注册了对象,那么这将是确保对象符合其所提交角色的最佳时机

总的来说,记住你有很好的反思能力

关于缺少封装的问题:鉴于coffeescript为原型方案实现了一个非常好的类包装器,我假设您的意思是缺少私有变量?如果你觉得有必要的话,实际上有很多方法可以向客户隐瞒细节,我也是;通常是为了防止自己在将来射中自己的脚。关键通常是把东西藏在瓶盖里

另外,请看一下
对象。uuu defineGetter\uuuu
/
对象。defineProperty?
getter和setter在这些情况下会有很大帮助

关于减少迭代时间:

我使用咖啡中的内置文件监视程序来编译更改脚本。再加上TextMate能够在失去焦点时保存所有打开的文件,这意味着测试就是从TextMate切换到chrome/firefox并点击刷新。相当快


不过,在node.js项目中,我已经将视图设置为只进行动态编译和服务,因此即使是文件查看器也是多余的。它们在发行版中被缓存,但在调试模式下,它们总是从磁盘重新加载、重新编译,一旦遇到错误,我就把它们提供出来。因此,现在每隔几分钟我就切换到浏览器,点击刷新,或者看到我的测试正在运行,或者看到编译器错误。

这不是答案,但要在coffeescript中高效工作,您必须非常熟悉Javascript。如果你不是,调试体验可能真的很痛苦。我对Javascript和Coffeescript都很熟悉-我可以根据应用程序行为识别bug,我理解Javascript的大部分奇怪部分。更重要的是,我一直在犯我在静态类型语言中不会犯的错误/bug。我不知道采用特定的编码风格是否会有所帮助(这使类型更清晰,更难做出简单的键入和类型错误)-但目前我不相信这不是别人已经解决的问题。在使用动态语言时,自动测试是至关重要的。拥有一个好的测试套件对于在对应用程序进行可能会破坏性的更改时捕捉错误非常有帮助。再说一次,我了解Javascript和原型继承(而且我并不完全是Coffeescript的初学者)。更重要的是,我没有一个工具带,可以用原型语言来解决问题(而我可以很快设想用经典的oo来解决问题)。类似地,我犯的错误更多的是编译器或