最近一直在关注谷歌发布的Dart语言,到目前为止,我并没有被这门语言所吸引,在我看来,设计师在设计这门语言的时候,是欠缺考虑的,下面就来分享一下我的观点。 基于OO的类和接口 第一眼看到Dart代码觉得与Java很像。语法也极其相似:使用 . 来调用方法、大括号表示块、在语句后面使用分号、main()表示主方法。类和接口也非常相似,使用单继承和抽象接口代替多重继承来解决菱形继承问题。 在Dart的使用规范里面还提到了工厂(静态构造函数)。(工厂?是把1997的那个设计模式重新设计一遍吗?)还有,集成的流行设计模式在语法级别上很令人失望,像是在拥抱一个承认失败的设计模式。 充满遗憾地是更现代的和更有用的面向对象范式并没有在Dart中所体现,比如角色。正如我们所知道的,接口是不可以共享代码的,只有方法原型可以实现。不仅仅如此,Dart还存在更多的问题。 弱类型 文档规范中指出:“Dart程序会被静态检查,静态检查器会把那些违法类型的行为规则报告上去,但是这种行为并不会中止编译或者停止程序执行”。换句话说,“静态检查器”就是一个lint-type开发援助,而不是一个语言特性。不幸地是,这也就意味着你可以使用错误的类型声明来编写代码,程序仍然可以运行。在你的语法语义中,类型显得毫无价值。 缺乏类型转换也意味着运行时不能利用类型信息去优化运行时程序(例如通过pre-resolving方法调用),通过一些声明装饰机制,来混合弱类型和强类型。相反,Dart的设计师发现类型推理是很难实现的,于是放弃自身拥有的类型优势,而类型本该可以进入运行时进行优化的。 这种弱类型设计从根本上消除了使用接口的缺点,接口不允许代码共享。那么在他们(在浏览器进行页面加载的时候对他们进行解析和编译)中添加这一点又有什么意义呢?接口在强类型语言中使用会更有意义(比如Java)。 Booleans 布尔运算,True or False。在代码里面,如果if(1){……}将永远不会执行,因为1仅仅是一个数字,而不是一个Boolean值,并且这里也没有其他隐式转换。相反,你应该这样写if(1==1)。 布尔类型的真和假可以自动装箱到对象中,并且作为对象,他们不能为null。因此在定义的时候即为True。对程序员来说,一些细小次要的问题被固定在语言层面上允许通过布尔强制加载或者是拒绝布尔自动装箱,这些看起来会非常麻烦。(值得注意的是,Dart是允许加载操作而不是boolean、string或数字类型进行强制重载。) 另外要小心的是,操作符==相当于equality,!=和!==表示inequalities,这些均可返回一个布尔值;但是==并不需要这样做,因为他可以重载而且在它的返回值上面并没有运行时类型执行,这也就意味着表达式(a==a)在某种病理情况下会返回false。在我看来,在一个设计良好的语言中,这种情况是绝不应该发生的。 类型转换 在数字型、字符串类型或者是布尔类型中没有任何隐式转换。整型和浮点型是不同的类型。对象中会提供一个toString()方法(返回一个字符串类型!)来进行字符串转换,例如int foo=42;String bar=“$(foo)”;Math类里面提供了把字符串类型转换成数字型(parseInt 和parseDouble)。 异常 如果查看标准异常列表,会发现许多基于异常控制流的类扩散。现在的程序员真的是越来越懒了,他们宁愿用一个NullPointerException来捕获异常,也不愿意去写一个程序去测试对象是否为Null,因为那样做语法更简单。(类似这样结构,if(a) a.foo();在Dart中将不会执行。) 另外Ovid还提到这个异常NoMoreElementsException并且补充到:“多年以前的Java程序员在抛出这个异常的时候,仅仅是为了一些特殊的东西而不是期望些什么?” 隔离和沉重的线程模型 Dart只支持单线程,在Dart中没有共享状态并发性。通过分离actor-like实体来支持并发。因此隔离是一个重量级的线程控制,很像Perl 5中的ithreads。这意味着,它们是很好的数据隔离,但是对内存会有超高的消耗,因为生成一个新的隔离要克隆运行库中的所有对象和数据结构。(顺便说一下,Dart没有Perl’s中的CLONE()方法。)这里有一个轻隔离,是指它们在相同的线程中运行而不是去创建这些线程。 隔离是通过消息传递进行交流的。目前还不清楚在标准库或者其他中是否还有一些同步方法可用。 安全 Dart是一种词法作用域,给变量、函数和类型使用单一的命名空间。Dart提供私有名称,这些名称仅以下划线开始,这些名称在没有声明的外库中是无法进入的。Dart提供库导入和源文件引用。在代码加载的时候规范中并没有提及哪些地方是被限制的,这个可能会在以后的Dart版本中进行说明。导入一个库时,会在导入的名称前面指定一个命名空间(或前缀),这样就可用避免重名。目前还不清楚,Dart是如何处理二级导入或者递归导入的。但是命名规则是十分清晰的并且取消全局命名空间是一个非常棒的想法。 结论 这是世界上最糟糕的两件事:Dart既没有展现出静态语言式的优点,又没有吸收动态语言的灵活性。它没有从近十年来动态语言的复兴中学到任何内容,包括功能(语言)世界,它甚至没有从Go的并发模型中获得启示,虽然Go语言同样出自Google。所以我认为这是一个退步的语言设计。与Node.js和Coffeescript比起来,Dart似乎已经过时! 这篇仅仅是作者在研究完Dart后发表的一种观点和对未来Dart发展的一种预测。Dart作为21世纪的一门新语言,有强势的地方,也有不足的地方。在各种新兴语言中(Go,D,Rust,Dart等)有人却十分看好Dart。Dart不仅保留JavaScript的动态性,提供了更好的性能表现以及更加适应大型工程开发等特性。相比于JavaScript,它在设计中更多的考虑了语言的简洁性、效率以及可伸缩性。用Dart编写的应用程序不仅可以在本地虚拟机上执行,同时也可以完美转化成JavaScript语言,在任何JavaScript引擎上运行,确保和现有体系平滑对接。 对此,各位程序员,你们是持怎样的观点呢? 英文:Why Dart is not the language of the future 本文为ImapBox编译整理,未经允许不得转载。如需转载请联系market@csdn.net。
本网页所有文字内容由 imapbox邮箱云存储,邮箱网盘, iurlBox网页地址收藏管理器 下载并得到。
ImapBox 邮箱网盘 工具地址: http://www.imapbox.com/download/ImapBox.5.5.1_Build20141205_CHS_Bit32.exe
PC6下载站地址:PC6下载站分流下载
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox 网页视频 工具地址: http://www.imapbox.com/download/ImovieBox4.7.0_Build20141115_CHS.exe
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算