哥哥带你学Dart
概念:
Dart是什么?
具体Dart语法内容请走这边:https://www.jianshu.com/p/9e5f4c81cc7d
Dart是一门新的编程语言,如同JAVA、PHP一样,是为了解决编写应用程序中的一些实际问题而被造轮子发明出来的,而这个造轮子的人就是 Google。可能大家都熟悉Google 的另一个轮子Golang,而对Dart 听闻甚少,其实Dart 的出生跟Go很相近,只是由于它的星途比起Go来说有点坎坷,一直没有被广大开发者重视,相关的技术文章和应用比较匮乏,也就一直蒙尘在泛泛语言之中。
最初设计Dart,是Google的一帮程序员出于对JavaScript的不满,决定自己搞一个新语言用来替换JavaScript的,所以刚开始Dart也就是用来作为浏览器脚本运行在浏览器中的。为了推广Dart,Google利用自己的利器Chrome让它内置了DartVM的引擎。有了运行环境,加上用户群的可观数量,Dart最初也赢得了部分前端开发者的青睐。但是!!!,咳咳,这里要停顿一下,有转折——Google的这帮程序员万万没想到,看似并无大用的JavaScript居然因为NodeJS而焕发了第二春。此时移动互联网处于萌芽发展中,一个叫做NodeJS的开源项目借助这股移动互联的东风顺势而起,很快的烧遍了前端、烧到了后端,甚至烧到了手机应用和桌面应用,可以说是在编程界无孔不入,几乎成就了JS程序员口中的“凡是能被JS实现的,最终都要被JS实现”的愿景。前端的开发模式因此而改变,进入了一个新的天地。一些明星项目如React、React-Native、Vue等等如雨后春笋般迅速的崛起,一句话总结就是“Javascript很忙”。
Javascript很忙,程序员更忙,Dart就这样被慢慢地遗忘在角落。加上一直以来缺少顶级的项目使用,就算再是亲儿子,得不到JS开发者的心,Google也没什么办法,在2015年的时候,Google在Chrome中默默的移除了内置的Dart引擎。但是!!!这里又是但是,我喜欢在但是这里停顿一下,可以刷存在感2333——Google并没有放弃Dart,Google内部用Dart编写孵化了一个移动开发框架Sky,之后又被命名为Flutter,进入了移动跨平台开发的领域。如同Javascript,Dart在服务端和浏览器前端也在不遗余力的发展:服务端可以编写命令行程序,前端可以编译成Javascript运行在浏览器中。Google的另一个前端大杀器Angular也有对应的Dart版本。在Google的未来操作系统Fuchsia中,Dart被指定为官方的开发语言。
Dart的发展经历这么多,在历史的版本迭代中,已经不是当初设计的仅仅作为一个脚本运行在浏览器中了。船小好调头,也正是使用者较少,没有历史包袱,Dart的创造者们总结了Dart1.0版本的优缺点,决定打造一个运行更快、更加安全的强类型语言Dart2.0(在Dart2.0之前,Dart是一门弱类型语言。变更为强类型语言(注:官网原文是 Dart 2.0 has a sound type system )之后,Dart依旧可以使用类型推断等弱类型语言的特性)。Dart2.0版本目前正处于dev的状态,开发者可以使用Dart进行开发了,在不久之后就会发布正式的版本。
Dart 属于什么级别的语言
Dart 属于应用层编程语言。它有自己的 DartVM ,通常情况下运行在自己的VM上,但是在特定情况下他也可以编译成 Native Code 运行在硬件上(比如移动开发框架中,Flutter 会将代码编译成指定平台的 Native Code 以提高性能)。运行 Dart 编写的软件,既可以以明文代码的方式直接运行,还支持运行快照打包后的二进制,以提高启动速度、安全性和性能。你可以将它当做JAVA,亦可以当做 JavaScript;它比 JAVA 简单,易于理解,比JavaScript 更加规范,更加工程化。
Dart 的特性
单进程异步事件模型;
强类型,可以类型推断;
DartVM,具有极高的运行效率和优秀的代码运行优化,根据早前的基准测试,性能比肩 Java7 的JVM;
独特的隔离区( Isolate ),可以实现多线程;
面向对象编程,一切数据类型均派生自 Object ;
运算符重载,泛型支持;
强大的 Future 和 Streams 模型,可以简单实现高效的代码;
全平台语言,可以很好的胜任移动和前后端的开发。
在语法上,Dart 提供了很多便捷的操作,可以明显减少代码量。比如字符连接,可以直接"my name is $name, age is $age",无需+号拼接,也无需做类型转换。
使用 Dart 可以做什么
登录 Dart 的官网,你可以很清楚的看到 Dart 的创作者将 Dart 明确的分成了三个方向: 移动开发、DartVM 命令行程序(Server 端)、浏览器(前端)。
移动开发:这是 Dart 的杀手锏,也是众多 Dart 开发者开始接触学习 Dart 语言的原因。这个移动开发的核心是叫做 Flutter 的一个框架,它使用Dart + C++ + Skia 开发,对外提供了完全不依赖系统平台的 Widget 的能力,只通过自绘图形的方式工作,因此具有极其优秀的跨平台性。目前已经支持了 iOS、Android、Fuchsia。可以想象,你对应 Android 编写的一套软件可以不用修改一行代码的运行在 iOS 中,甚至是未来的 Fuchsia 中(尽管不知道这个系统最终能不能发布出来),是不是很有要马上去尝试的心动?
DartVM 命令行程序:就是写服务端的应用。比如写个 http 的服务,对应用提供 api ,都是及其简单的事情。和 JavaScript 一样,Dart 也是单进程异步事件的模型,所以它天生擅长高并发,而且它还提供了隔离区(isolate)的接口,可以实现多线程的操作,应对CPU密集型场景也不再话下。
浏览器:这个应该是 Dart 一开始造轮子的初衷,结局嘛,大家也都是知道,还是 JS 一统江湖。所以我只是建议大家在前端用用看,毕竟 Angular 也有官方的团队在支持 Dart 的版本,而且用 JS 写简单的应用还好,复杂的场景下那个代码真的是。。。。这个时候用 Dart 一定会给你一个完全不一样的体验。当然,可能开发效率上Dart会逊色一些,但维护成本上 Dart 绝对碾压 JS。(这里用“碾压”是一种夸张的手法,望知.)
总之,Dart 可以做的很多,涉及到编程的方方面面。但是当下我最看好的是移动开发的前景。Google 也是想鼓励开发者使用这个Flutter 来为以后的 Fuchsia 打基础,做生态,所以 Flutter 这块各位可以放心大胆的用起来。对。就是现在!!!
为什么要用 Dart
Dart 仅仅是你工作中解决问题的一种选择,我认为特定的场景中使用最适合的语言编程才是聪明人的做法,所以为什么要用 Dart 这取决于你。如果非要给个理由,那可能就是 Flutter 让你爱上的原因。
学习 Dart 的路线
不管你是 JavaScripter、JAVAer,还是PHPer、Pythoner,还是Goer、Ruster,都可以用极低的成本学习 Dart ,并在短时间内上手做东西。如果你是一个开发的入门者,那我建议你还是先学习一下国民语言C,无论你是不是要学习 Dart,你都应该先走学习 C 的路线。
学习 Dart 的路线,我只针对有编程经验的人来说,可以分成四步:基础语言语法 ;代码编写风格;基础类库的使用;开始你的编程。
我比较鼓励开发者在学习新语言的时候尽早的上手项目去使用它。只有你在编程中反复的使用,你才会理解继而更好的运用这个语言的优势。如果可能,还可以在一段时间后对代码进行重构,更能加深对该语言的组织和整体语言的进一步理解。
Dart 入门教程
1,所有能够使用变量引用的都是对象, 每个对象都是一个类的实例。在 Dart 中 甚至连 数字、方法和 null 都是对象。所有的对象都继承于 Object 类。
2,使用静态类型(例如前面示例中的 num ) 可以更清晰的表明你的意图,并且可以让静态分析工具来分析你的代码, 但这并不是牵制性的。(在调试代码的时候你可能注意到 没有指定类型的变量的类型为 dynamic。)
3,Dart 在运行之前会先解析你的代码。你可以通过使用 类型或者编译时常量来帮助 Dart 去捕获异常以及 让代码运行的更高效。
4,Dart 支持顶级方法 (例如 main()),同时还支持在类中定义函数。 (静态函数和实例函数)。 你还可以在方法中定义方法 (嵌套方法或者局部方法)。
5,同样,Dart 还支持顶级变量,以及 在类中定义变量(静态变量和实例变量)。 实例变量有时候被称之为域(Fields)或者属性(Properties),和 Java 不同的是,Dart 没有 public、 protected、 和 private 关键字。如果一个标识符以 (_) 开头,则该标识符 在库内是私有的。详情请参考: 库和可见性。
6,标识符可以以字母或者 _ 下划线开头,后面可以是 其他字符和数字的组合。
7,有时候 表达式 expression 和 语句 statement 是有区别的,所以这种情况我们会分别指明每种情况。,7Dart 工具可以指出两种问题:警告和错误。 警告只是说你的代码可能有问题, 但是并不会阻止你的代码执行。 错误可以是编译时错误也可以是运行时错误。遇到编译时错误时,代码将 无法执行;运行时错误将会在运行代码的时候导致一个 异常。
关键字:
带有上标2的都是用于异步相关特性的对于只有一个表达式的方法,你可以选择 使用缩写语法来定义:
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
这个 => expr 语法是 { return expr; } 形式的缩写。=> 形式 有时候也称之为 胖箭头 语法。
注意: 在箭头 (=>) 和冒号 (;) 之间只能使用一个 表达式 – 不能使用 语句。 例如:你不能使用 if statement,但是可以 使用条件表达式 conditional expression。