以下文章来源于前端技术地图,作者荒山
世界上没有一种可以各个领域通吃的语言,为了应对不同的场景和需求,我们摆脱不了要学习一门新的语言。最近准备入坑 Flutter
(技术储备),学了点 Dart, 一点心得分享给大家。
大纲
我想看这篇文章的应该都是程序员了吧?都有自己熟悉的语言,这就好办了,我们可以复用已有的认知去快速学习一门新语言。如果你是小白,这篇文章可能不适合你
Swift/Objective-C
基本只能用于 Apple 平台,尽管 Swift 开源,也可以跑在 Linux 上,但除了 Apple 应用开发,很少看到 Swift 的身影C#
和 Swift 类似JavaScript
:浏览器脚本语言霸主, 写前端肯定绕不开 JavaScript 啦。一门十几天搞出来的语言,就不要问 [] == ![] // true
是什么动机了, 不要学这些糟粕。Dart
:针对客户端('Flutter')优化语言, 当初号称要取代 JavaScript, 官方自己的定位就是客户端Go
:据说是 C++
编译速度慢倒逼出来的语言。所以你可以站在 C++ 的对立面去思考它的设计:例如 简单的语法、高速编译、垃圾回收、高性能、高并发。半数是为了解决 C++ 的问题。适用于服务器编程、分布式、网络编程、云平台。Rust
:系统编程语言,C/C++
最有力的挑战者下面是常见编程语言的构成图谱,对照一下,这些概念是否都知道? 是否真的了解你用来吃饭的家伙?
没看懂?看来你没学过一门真正(复杂)的语言,如 Scala
、C嘎嘎
,Rust
。? 翻过这些大山,其他的就是一览众山小了。太难了
小孩子才做选择,牛逼(有精力)的人是全都要。你也可以学几门比较有代表性语言。参考《七天七语言》[1]开始点技能树:
上文说了,80% 的知识是可以复用的,我们要针对另外 20% 该语言独有的特性和思想进行刻意学习。我这里介绍一个方法是建立一个标签云。这个标签云是对这门语言的一些关键描述。例如它的主要特性、优点、吐槽点。
这些关键描述对我们快速了解一门语言有很大的帮助, 这个标签云其实代表的就是你对这门语言的基本印象。换句话说,你学了一门语言,但没怎么用,过一段时间就忘光了所有语法细节,但是这门语言的基本印象会长久停留在你脑海中。我想这些印象就是这门语言的精髓所在吧!
那么怎么收集这个标签云?
随便举几个例子。Dart 语言:
标签云使用 WordClouds[2] 生成
Go 语言:
Javascript:
Elixir:
接着带着这些问题针对性地去学习这门语言, 这里以 Dart 为例,因为这两天正好在学 Dart,准备入坑 Flutter,我自己对 Dart 没什么好感。
学习方法, 永远是 What / Why / How: 是什么,为什么这么设计,具体怎么做?
没有 Flutter 这门语言确实要挂了。编程语言也要看爹
这是官方自己的定位。
针对客户端优化主要体现在开发体验
和运行性能
上面
JIT
(Just in Time) 快速编译生效,这是 Hot reload 基础。Hot reload 可以让 Flutter 接近 Web 的开发体验AOT
(Ahead of Time) 生成高效原生代码。可以得到更快的运行速度和启动速度语法和 Java 很像,有一些语法糖挺甜的。
Mixins
。前端对 Mixin 的概念应该都不陌生,毕竟这么多人用 Vue?new
可选。在某些场景让代码更简洁,比如 Flutter 组件声明。算是弥补没有 JSX 之痛吧。
void main() { runApp( Center( child: Text( 'Hello, world!', textDirection: TextDirection.ltr, ), ), ); }Callable Classes
。语法糖,没想到有什么应用场景。
class WannabeFunction { call(String a, String b, String c) => '$a $b $c!'; } var wf = new WannabeFunction(); var out = wf("Hi","there,","gang"); // ?
我直接 wf.call
也不麻烦吧? 灵感来自 JavaScript?JavaScript 的函数也是一个对象,可以有自己属性Dart 也有一些有趣的操作符/表达式,来看看有多甜:
展开操作符
、Collection if/for
, 再加上命名函数参数
和 new可选
,表达力已经很接近 JSX 了
[0, ...list]; [0, ...?list]; // 支持识别null的展开操作符 // collection if var nav = [ 'Home', 'Furniture', 'Plants', if (promoActive) 'Outlet' ]; // collection for var listOfStrings = [ '#0', for (var i in listOfInts) '#$i' ];
在 dart 中 const/final 使用的地方非常多,可以用于修饰变量、实例变量、对象创建。
注意:静态数据和不可变数据是不同的概念
final name = 'Bob';
const bar = 100000;
const foo = [];
const baz = [];
console.log(foo == baz); // true 编译时常量
const 将被视为'编译时'常量。相对 final 有所优化
var foo = const [];
const 修饰变量创建,Dart 会默认以 const 的上下文来实例化对象:
const primaryColors = [
Color("red", [255, 0, 0]),
Color("green", [0, 255, 0]),
Color("blue", [0, 0, 255]),
];
primaryColor 被修饰 const 修饰,那么其下的对象创建都隐式使用 const 修饰。上面的代码等价于:
const primaryColors = const [
const Color("red", const [255, 0, 0]),
const Color("green", const [0, 255, 0]),
const Color("blue", const [0, 0, 255]),
];
Dart 内置的容器对象默认支持 const。对于自定义类,需要类提供const 构造方法, 而且所有实例都必须使用 final 修饰。
class ImmutablePoint {
static final ImmutablePoint origin =
const ImmutablePoint(0, 0);
// 所有实例变量都必须用final修饰
final num x, y;
// const 构造方法
const ImmutablePoint(this.x, this.y);
}
Future/Stream、async/await、Generator。不必多说,熟悉 JavaScript 一看就懂
noSuchMethod()
。类似于 Ruby 的 method_missing。当未找到属性或者方法时被调用,可以实现一些动态属性或方法。元编程神器。在 JavaScript 中可以通过 Proxy 实现相同的效果。说实话,Dart 没有什么多少让人眼前一亮的特性。在它身上你可以看到许多其他语言的影子、例如 Java、JavaScript、Swift... 这也无可厚非,现代编程语言确实长得越来越像。
好处是它特别容易上手,坏处是除了 Flutter 绑定之外,我找不到其他可以用它的理由。
借助已有的经验,很快就可以入门,这时候能马上上手去写是最好的。
可以从 Hello World 开始, 或者也可以从官方的入门教程开始。Dart 的话。
hello world !
void main(List<String> args) {
print('Hello, World!');
}
通过最简单的 hello world 也可以获知一些关键信息:
dart:core
这个包是全局的Flutter 搞起来!
如果你喜欢这门语言,想要让你们的关系进一步发展,你就要深入了解它:
编程语言也有三重境界:
看山是山,看山不是山,看山还是山
只要能解决我们需要解决的问题,编程语言从来不是门槛,或者说它是最容易被克服的问题。就像别人吐槽 Flutter 用 Dart 而不用 JavaScript 一样。
[1]
《七天七语言》: https://book.douban.com/subject/10555435/
[2]
WordClouds: https://www.wordclouds.com
[3]
七周七语言: https://book.douban.com/subject/10555435/
[4]
Wiki: Comparison of programming languages: https://en.wikipedia.org/wiki/Comparison_of_programming_languages
[5]
Dart 官方文档: https://dart.dev/guides/language/language-tour#libraries-and-visibility