Mastering Dart
目录
- 1
基础 - 2
高级技术/反射 - 3
对象创建 - 4
异步编程 - 5
Stream框架 - 6
Collection框架 - 7
Dart与JavaScript互操作 - 8
国际化和本地化 - 9
C/S通信 - 10
高级存储 - 11
支持其他HTML5特性 - 12
安全
基础
- 模块化
- pubspec.yaml
- import ‘dart:html‘ as dom;
- 习俗:_前缀代表私有
- import ‘animation.dart‘ as animation hide Animation; //似乎代码会直接影响IDE的自动完成?
- Dart的函数可以认为是JS去掉了无用的function关键字?
- void main() { ... }
- 引入了PHP的字符串模板:print("Result=#{result}");
- 函数简写法:sub(a,b) => a-b; //ES6直接支持?
- Class与mixin
- 奇怪的构造函数参数写法:Car(this.color, this.carrying);
- abstract(抽象基类就是接口)
- extends/implements
- mixin是特殊的Class,使用with关键字混入目标类,条件:
- 无(声明的)构造函数
- 无超类(或者说就是Object)
- 不包含对super的调用
- static const List L = const [‘A‘, ‘B‘, ‘C‘];
高级技术/反射
- 泛型
- Function:定义了call方法的class(vs C++里的函数对象?)
- 错误 vs 异常(可恢复)
- try { ... } on Error catch(ex) { ... }
- Annotations
- @deprecated
- @override
- @proxy
- 代理类:@override noSuchMethod(Invocation invo) { ...... } //借用了Ruby的思想?
- 定制:(嗯?似乎就是普通class)
- 反射
- Mirrors:ClassMirror MethodMirror
- 3个主要方法:reflect reflectClass reflectType
- 动态调用:class MethodInvoker implements Function {
- call(MethodMirror method){
- ClassMirror c = method.owner as ClassMirror;
- InstanceMirror inst = c.newInstance(new Symbol(), []);
- inst.invoke(method.simpleName, []); //语法上借鉴了Java;
- call(MethodMirror method){
- Mirrors:ClassMirror MethodMirror
对象创建
- 可选{位置、命名}参数:Car([this.color=‘w‘, this.weight=1000]); / Car({this.color:‘w‘, this.weight:1000});
- 命名构造:Car.fromIem(String item) { ... } //其实不就是C++里的工厂方法嘛
- 重定向构造(莫名其妙的说法,其实不就是构造函数的实现调用另一个构造函数嘛)
- Dart借鉴了C++的成员初始化列表语法?
- 私有构造:Car._();
- 工厂构造:这里实际上使用了抽象工厂设计模式
- abstract class Log { factory Log() { return new ConsoleLog(); } ... }
- 常量构造:加const限定,枚举类?
- 变量在使用前必须初始化?type ‘Null‘ is not a subtype of type ‘boolean expression‘.
- 赋值为null呢?
- 级联调用:..(这个语法比较丑陋,看不惯)
异步编程
- 调用栈 vs 事件驱动
- Future
- new File(‘a.txt‘).open().then(processFile);
- processFile(RandomAccessFile file){ file.length().then( (int len){ file.read(len).then(readFile).whenComplete( ... ) }); }
- catchError
- mirotask:优先于event被event-loop执行
- 推迟:new Future.delayed(new Duration(seconds:1), computation).then( (ret)=>print(ret) );
- Zones
- 一种可配置的执行上下文,用于处理异步任务和未捕获的异常:runZoned((){...}, onError: (e){...});
- zoneValues: ...
- zoneSpecification: ...
- 重载run以跟踪zone的执行:
- print: (Zone self, ZoneDelegate parent, Zone zone, String msg){...}, run: (Zone self, ZoneDelegate parent, Zone zone, f) => run(parent, zone, f, timer) //这里的代码有点难以理解,比如self与zone的区别?
- 一种可配置的执行上下文,用于处理异步任务和未捕获的异常:runZoned((){...}, onError: (e){...});
- Isolates:可以认为是单独的进程(不共享数据,仅通过复制的消息通信)
- 代码略... 并发:每秒24000请求??
Stream框架
- new File().openRead().pipe(request.response);
- 单个订阅 vs 广播
- Stream类(有点LINQ的味道)
- 验证方法:any every contains
- 搜索:firstWhere lastWhere singleWhere
- 过滤:where skip skipWhere take takeWhere
下略(Stream无非就是FP里惰性序列的应用)
Collection框架
- The Lazy Iterable(这个例子似乎不太恰当?)
- SplayTreeSet?(见鬼,Java里的TreeSet也是用Splay树实现的吗)
- Unmodifiable集合:不是Scala里的Immutable集合,仅仅在API级别做了运行时限制而已
Dart与JavaScript互操作
- with jQuery:JProxy
- dart:js
- 性能测试的例子很扯淡,我严重怀疑下面这个语句的真正实现:container.appendHtml(‘
Test
‘);
- 性能测试的例子很扯淡,我严重怀疑下面这个语句的真正实现:container.appendHtml(‘
国际化和本地化
- Intl库
C/S通信
- dart:io HttpClient
- dart:html DivElement?
- Ajax polling(这个已经有点落伍了,不直接用WebSocket吗)
- SSE(tooold)
- WebSocket(基于TCP,但使用HTTP完成握手)
高级存储
- Cookies
- Web Storage
Web SQL- IndexdDB
支持其他HTML5特性
- 通知
- 原生拖放
- geolocation
- 对哦,为什么不能让用户直接指定位置作为输入呢,非得依赖什么GPS
- Canvas
安全
- TLS
- CAPTCHA
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-10 17:48:39