世界上没有一种能够各个领域通吃的语言,为了应对不一样的场景和需求,咱们摆脱不了要学习一门新的语言。最近准备入坑 Flutter
(技术储备),学了点 Dart, 一点心得分享给你们。前端
大纲程序员
我想看这篇文章的应该都是程序员了吧?都有本身熟悉的语言,这就好办了,咱们能够复用已有的认知去快速学习一门新语言。若是你是小白,这篇文章可能不适合你编程
肯定语言的定位和场景。别再说 PHP 是最好的语言了,你们都知道。每一门语言都有本身定位和适用场景,为了解决不一样的问题。因此学习一门语言的时候,首先要了解语言的定位和领域,这样你才能明白为何语言设计者设计某个特性的动机。例如:设计模式
JavaScript
:浏览器脚本语言霸主, 写前端确定绕不开 JavaScript 啦。一门十几天搞出来的语言,就不要问 [] == ![] // true
是什么动机了, 不要学这些糟粕。Dart
: 针对客户端('Flutter')优化语言, 当初号称要取代 JavaScript, 官方本身的定位就是客户端Go
: 听说是 C++
编译速度慢倒逼出来的语言。因此你能够站在 C++ 的对立面去思考它的设计:例如 简单的语法、高速编译、垃圾回收、高性能、高并发。半数是为了解决 C++ 的问题。适用于服务器编程、分布式、网络编程、云平台。Rust
: 系统编程语言,C/C++
最有力的挑战者固然,也有一些语言只有在特定平台或场景才能使用,这种没办法,这属于商业壁垒。例如数组
Swift/Objective-C
基本只能用于 Apple 平台,尽管 Swift 开源,也能够跑在 Linux 上,但除了 Apple 应用开发,不多看到 Swift 的身影C#
和 Swift 相似不要陷入语言的语法细节,剥离掉语法糖。学习新语言,能够暂时忽略掉语法的细节, 切换到上帝视角浏览器
基于原有的认知,横向进行比较。正常来讲编程语言 80% 概念或范式是通用的,这就是为何你熟悉一门语言,能够快速入门其余语言。服务器
打破认知。另外 20% 包含该门语言独有的特性和思想, 这才是咱们须要关注的核心。网络
下面是常见编程语言的构成图谱,对照一下,这些概念是否都知道? 是否真的了解你用来吃饭的家伙?并发
没看懂?看来你没学过一门真正(复杂)的语言,如 Scala
、C嘎嘎
,Rust
。😺 翻过这些大山,其余的就是一览众山小了。太难了异步
小孩子才作选择,牛逼(有精力)的人是全都要。你也能够学几门比较有表明性语言。参考《七天七语言》开始点技能树:
按市场划分:
按范式划分:
其余划分方式:
上文说了,80% 的知识是能够复用的,咱们要针对另外 20% 该语言独有的特性和思想进行刻意学习。我这里介绍一个方法是创建一个标签云。这个标签云是对这门语言的一些关键描述。 例如它的主要特性、优势、吐槽点。
这些关键描述对咱们快速了解一门语言有很大的帮助, 这个标签云其实表明的就是你对这门语言的基本印象。 换句话说,你学了一门语言,但没怎么用,过一段时间就忘光了全部语法细节,可是这门语言的基本印象会长久停留在你脑海中。我想这些印象就是这门语言的精髓所在吧!
那么怎么收集这个标签云?
随便举几个例子。 Dart 语言:
标签云使用 WordClouds 生成
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 很像,有一些语法糖挺甜的。
没有关键字区分 class 和 interface,能够说 class 就是 interface
Mixins
。前端对 Mixin 的概念应该都不陌生,毕竟这么多人用 Vue?
操做符重载。Javascript 不支持操做符重载。因此对前端来讲算是一个新东西。 不过我的不推荐,JavaScript 没有操做符重载不也用得挺爽? 并且操做符的语义不明确,会徒增心智负担,这时候还不如使用定义良好的方法。有意义的名称比符号要好记忆。
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 也有一些有趣的操做符/表达式,来看看有多甜:
级联操做符(Cascade Notation)。级联操做符是一个很甜的语法糖。不说废话,看代码:
querySelector('#confirm') // Get an object.
..text = 'Confirm' // 🍬 甜点,这是类 jQuery 的串行调用的加强版
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
复制代码
等价于:
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
复制代码
容器操做符(Collection Operators)。这个语法糖也会比较甜,前期用 Dart 来描述 Flutter 的视图是一件很痛苦的事情。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);
}
复制代码
名义类型。没有Duck Duck Duck 🦆🦆🦆
Sound Type System(soundness,严格类型系统)。即静态类型+运行时检查, 好比一个变量静态类型为 String,若是将int赋值给它,编译器会报错。可是经过某些手段,咱们能够绕过编译器检查,例如强制类型转换。Sound Type System 能够在运行时进行类型检查,不会放过这些错误。
main(List<String> args) {
int a;
a = "1" as int; // 绕过了静态类型检查, 可是运行会报错
}
复制代码
好处:
dynamic:能够视做是any类型吧?尽可能避免使用
Future/Stream、async/await、Generator。没必要多说,熟悉 JavaScript 一看就懂
MetaData。和Java的注解差很少。顾名思义,MetaData就是给你的代码提供更多的信息。能够用于提示编译器,在运行时经过反射库也能够获取到MetaData信息。
class SmartTelevision extends Television {
@override
void turnOn() {...}
// ···
}
复制代码
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同样。