Dart对网络程序员有任何有用的功能吗?


33

http://www.dartlang.org/

我已经非常简短地检查了该站点,并感到好奇。使用Dart有什么好处吗?它只是JavaScript的替代品吗?

看起来更简单的Java。在工作中编写了大量的C#,这种语言的感觉非常像我惯用的语言,因此学习语法看起来像是轻而易举的学习。是否有人对此语言有任何意见或经验?

(与CoffeeScript(=我没有使用Ruby语法)相比,该语法对我来说更熟悉)。


18
道格·克罗克福德(Doug Crockford)的评论很有趣:“所以,我想了很久……如果我能拿出一张干净的纸,写一种保留Javascript的所有优点的新语言……我就不会来了。像Dart这样的东西。”
MebAlone

2
@MebAlone Ho-ho-ho,多么有见地。克罗克福德真是个混蛋。智慧的智慧。
funkybro 2012年

11
@MebAlone Dart语言设计师没有想出一种保留JavaScript所有优点的新语言。他们试图为浏览器提出一种基于类,面向对象的语言。
MarkJ 2012年

1
什么Is there any advantages of using Dart?意思 优势超过什么,衡量如何?有多种可编译为JavaScript的语言。他们大多数人做的事情比Dart好得多。有些事情比Dart做得更好。例如,如果您使用C#,那么ScriptSharp可能对您很有趣。尽管在所有可编译为JavaScript的语言中,它绝不是我的首选,但对您而言,它将呈现出非常容易的过渡,甚至可能不费吹灰之力即可移植现有代码。
back2dos

1
@MebAlone Douglas有点矛盾。抱怨的开发人员不接受新的想法,但说到2012年dart刚刚发布时就不好了。他们宣布它将在2年前推出。正如dart所说的,Douglas在JS中不满意某些事情(没有带有“松散悬挂”原型的构造函数)。在保留他喜欢的事物(例如闭包)的同时。在几个演示中,我看到他赞美原型,然后批评构造函数的语法(他是对的)。然后“解决”它显示了完全忽略原型存在的模块模式。
HMR

Answers:


65

感谢您的提问!完全免责声明,我在Dart团队工作。

Dart如今最大的优势可能是C#,Java,C ++和大多数JavaScript开发人员都很熟悉。许多开发人员对Dart希望达到和超越的语言(基于类的OO,词法范围,熟悉的语法)和工具(代码完成,重构,代码导航,调试)抱有一系列期望。

这是我喜欢该语言的一些方面:

  1. 可选的静态类型。当我进行原型设计或只是编写小型脚本时,我不会使用大量的静态类型。我只是不需要'em',而且我不想陷入仪式的泥潭。但是,其中一些脚本会演变成更大的程序。随着脚本的扩展,我倾向于使用类和静态类型注释。

  2. 无罪,直到证明有罪。Dart尽力减少导致编译时错误的情况。Dart中的许多情况都是警告,它们不会阻止程序运行。为什么?为了与Web开发方式保持一致,必须允许开发人员尝试一些代码,点击重新加载,然后看看会发生什么。在测试代​​码的一小部分之前,开发人员不必首先证明整个程序是正确的。

  3. 词法范围。如果您不习惯的话,这太棒了。简单地说,变量的知名度,甚至是由程序结构定义。这消除了传统Web编程中的一类难题。无需重新绑定功能,以保持这个你的想法或期望。

  4. 真正的课程融入了语言。显然,大多数开发人员都希望在课堂上工作,因为大多数Web开发框架都提供了解决方案。但是,在传统的Web开发中,框架A的“类”与框架B不兼容。Dart自然使用类。

  5. 顶级功能。Java的一个令人痛苦的部分是,所有内容都必须放在一个类中。这有点人为,尤其是当您要定义一些实用程序功能时。在Dart中,您可以在任何类之外的顶级定义函数。这使库的组成感觉更自然。

  6. 类具有隐式接口。消除显式接口可简化语言。不再需要在任何地方定义IDuck,现在只需要一个Duck类。由于每个类都有一个隐式接口,因此您可以创建一个MockDuck implements Duck

  7. 命名构造函数。您可以给构造函数命名,这确实有助于提高可读性。例如:var duck = new Duck.fromJson(someJsonString)

  8. 工厂构造函数。工厂模式很常见,很高兴看到它融入了语言。工厂构造函数可以返回单例,来自缓存的对象或子类型的对象。

  9. 隔离。在线程之间共享可变状态的日子已经一去不复返了(一种容易出错的技术)。Dart隔离是隔离的内存堆,能够在单独的进程或线程中运行。隔离通过在端口上发送消息来进行通信。隔离Dart VM中的工作,并且可以将其编译为HTML5应用程序中的Web worker。

  10. Dart编译为JavaScript。这一点至关重要,因为JavaScript是网络上的通用语言。Dart应用程序应在现代网络上运行。

  11. 强大的工具。Dart项目还附带了一个编辑器。您会发现代码完成,重构,快速修复,代码导航,调试等。此外,IntelliJ还具有Dart插件。

  12. 图书馆。您可以将Dart代码组织到库中,以简化命名空间和可重用性。您的代码可以导入库,并且库可以重新导出。

  13. 字符串插值。这只是一个不错的功能,使编写字符串变得容易:var msg = "Hello $friend!";

  14. noSuchMethod Dart是一种动态语言,您可以使用来处理任意方法调用noSuchMethod()

  15. 泛型。能够说“这是苹果列表”为您的工具提供了更多信息,可帮助您及早发现潜在错误。不过,幸运的是,Dart的泛型比您可能习惯的更简单。

  16. 操作员重载。Dart类可以为诸如+或的运算符定义行为-。例如,您可以编写类似的代码new Point(1,1) + new Point(2,2)

综上所述,还有更多的JavaScript库。

就个人而言,我相信网络上存在多种语言的空间。如果该应用程序很棒,并且可以在大多数现代浏览器中运行,那么我不太在乎它用什么语言编写。只要您(开发人员)满意,富有成效并且可以在网络上启动,那重要的是!:)


许多现代编程语言(Ruby,Scala,Python)都包含某种多继承机制,这是JDK8中引入的。这是为Dart计划的吗?
MebAlone 2012年

4
在点1上+1 –对于小型脚本(即“表单验证”级别),动态键入已足够。除此之外,我发现静态类型的安全网是必不可少的。
funkybro 2012年

2
@MebAlone我希望我们会在不久的将来看到mixins进入Dart。
塞斯·拉德

没有提到惊讶的快照功能-IMO是Dart的最佳功能之一。
mythz 2012年

@mythz我没有提到快照,因为快照尚未完全实现。但是,是的,它们很酷!
赛斯·拉德

11

在工作中编写了大量的C#,这种语言非常像我所习惯的

那是关于Dart的一点。Javascript被认为是一种笨拙的语言,几乎没有任何成语。在像Java这样的语言中,通常有一种自然的方法来解决问题。例如,如果您保留表格清单,则可以使用Java或C#创建一个Table类。

Javascript没有类,您可能想使用原型,但是它们感到很尴尬,并且没有提供如此强大的结构和封装工具。(至少没有做任何特技。)继承,合成等对于Javascript原型很尴尬。这就是为什么大多数人使用普通哈希映射来存储数据的原因。或者他们使用第三方原型之类的库,为您提供类似类的体验。

因此,便利是一回事,而结构又是另一回事。Javascript不能很好地扩展,因为没有标准的方法来构建大型应用程序。但是,目前这种第三方聚会库正变得非常流行。(例如骨干.js)

Dart可以解决这个问题。它在那里为您提供Java的结构上的便利,而且它不具有所有这些笨拙的JS功能。(大多数与弱打字有关。)

因此答案是肯定的:类,继承,...:“传统OOP”。(目前,大多数现实世界中的JS Web应用程序都使用基于jQuery的基于回调的方法作为主要结构。)而且它具有一种松散的静态类型,但这并不是主要卖点。

顺便说一句:您可能想阅读2010年的Google内部邮件:Javascript的未来

Javascript具有根本的缺陷,仅通过发展语言就无法解决。对于Javascript的未来,我们将采取两种策略。开发一种新的语言(称为Dash),其目的是保持Javascript的动态特性,但具有更好的性能,并且适合大型项目的工具。 。


5
并非所有人都认为Javascript是“尴尬的语言”。通常有一种自然的方法来解决问题。它经常需要Java不支持的技术(功能编程,运算符重载,mixin,通用编程)。继承,组合等对于Javascript原型而言并不尴尬。它与Java和C#不同,但与Ruby,LUA和Perl相似。
凯文·克莱恩

1
嗯...我第一次听到关于原型的任何好消息。但是您以哪种方式看到类似于Ruby的JS原型?
菲利普(Philip)

1
您需要更频繁地离开(Java世界)。查看Ruby元编程(ruby-doc.org/docs/ProgrammingRuby/html/ext_ruby.html),您会看到Ruby成员名称解析类似于(但IMO比Java成员名称解析更复杂)。
凯文·克莱恩

jQuery绝不以任何形式或形式来促进回调方法,这比DOM API(它实际上包装的)或核心JS本身或Dart所能提供的更多。原型是一种继承机制,可让我们做类不能做的事情。将类与函数构造函数进行比较,该函数构造函数封装内部实例var很好,而不封装原型。并非您的中级人才bean / getter-setter垃圾邮件Java或C#开发人员对封装的好处有丝毫的了解,或者普通的Google开发人员对如何编写JavaScript的了解也不多。
Erik Reppen

@ErikReppen:如果您仅将jQuery用于DOM操作,则可以编写几乎不需要任何回调的代码,以防将其与其他框架(如ribs.js)结合使用。用jQuery绑定事件在很大程度上促进了(匿名)回调。bone.js具有恕我直言的更结构化的方法。
菲利普(Philip)

5

对我来说,这给了我比使用范围和类更好的结构代码的机会。

它类似于Java和JavaScript,并且使用Dart编辑器,适应性几乎为零。我立即开始编码。

var ws = new [Moz]WebSocket必须迎合不同的浏览器很烦人。Dart可以编译为与流行浏览器兼容的JavaScript代码。

我的挑战主要是与JavaScript代码交互。我以某种方式找到解决方法,但是如果它是Dart的一部分,那就更好了。


同意@ Abiola,Dart需要更好的JavaScript互操作。这非常受关注,我很期待团队的想法。
塞斯·拉德

0

自从Web 2.0诞生以来,Java / C#方法在偏向JS方面肯定存在偏见。这是由于客户端语言和服务器端语言之间的人为(或非常真实和必要的)区别。我认为这是因为服务器端语言可以保留在Web应用程序核心问题域的“控制”中,并可以将不太严重的代码(ui代码)与业务代码(服务器端)区分开来。我还认为Java仍然喜欢保留服务器端内核,因为它很大程度上由于Flash和HTML 5而失去了与applet的GUI战争。 。

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.