Mastering Dart(读书笔记)——有意思的地方在于它的Future、Isolates和Zones

来源:互联网 发布:java 就业培训机构 编辑:程序博客网 时间:2024/05/22 13:21

Mastering Dart

目录

  • 1基础
  • 2高级技术/反射
  • 3对象创建
  • 4异步编程
  • 5Stream框架
  • 6Collection框架
  • 7Dart与JavaScript互操作
  • 8国际化和本地化
  • 9C/S通信
  • 10高级存储
  • 11支持其他HTML5特性
  • 12安全

基础

  1. 模块化
    1. pubspec.yaml
    2. import 'dart:html' as dom;
  2. 习俗:_前缀代表私有
  3. import 'animation.dart' as animation hide Animation; //似乎代码会直接影响IDE的自动完成?
  4. Dart的函数可以认为是JS去掉了无用的function关键字?
    1. void main() { ... }
  5. 引入了PHP的字符串模板:print("Result=#{result}");
  6. 函数简写法:sub(a,b) => a-b; //ES6直接支持?
  7. Class与mixin
    1. 奇怪的构造函数参数写法:Car(this.color, this.carrying);
    2. abstract(抽象基类就是接口)
    3. extends/implements
    4. mixin是特殊的Class,使用with关键字混入目标类,条件:
      1. 无(声明的)构造函数
      2. 无超类(或者说就是Object)
      3. 不包含对super的调用
    5. static const List L = const ['A', 'B', 'C'];

高级技术/反射

  1. 泛型
  2. Function:定义了call方法的class(vs C++里的函数对象?)
  3. 错误 vs 异常(可恢复)
    1. try { ... } on Error catch(ex) { ... }
  4. Annotations
    1. @deprecated
    2. @override
    3. @proxy
      1. 代理类:@override noSuchMethod(Invocation invo) { ...... } //借用了Ruby的思想?
    4. 定制:(嗯?似乎就是普通class)
  5. 反射
    1. Mirrors:ClassMirror MethodMirror
      1. 3个主要方法:reflect reflectClass reflectType
      2. 动态调用:class MethodInvoker implements Function {
        call(MethodMirror method){
        ClassMirror c = method.owner as ClassMirror;
        InstanceMirror inst = c.newInstance(new Symbol(), []);
        inst.invoke(method.simpleName, []); //语法上借鉴了Java;

对象创建

  1. 可选{位置、命名}参数:Car([this.color='w', this.weight=1000]); / Car({this.color:'w', this.weight:1000});
  2. 命名构造:Car.fromIem(String item) { ... } //其实不就是C++里的工厂方法嘛
  3. 重定向构造(莫名其妙的说法,其实不就是构造函数的实现调用另一个构造函数嘛)
    1. Dart借鉴了C++的成员初始化列表语法?
  4. 私有构造:Car._();
  5. 工厂构造:这里实际上使用了抽象工厂设计模式
    1. abstract class Log { factory Log() { return new ConsoleLog(); } ... }
  6. 常量构造:加const限定,枚举类?
  7. 变量在使用前必须初始化?type 'Null' is not a subtype of type 'boolean expression'.
    1. 赋值为null呢?
  8. 级联调用:..(这个语法比较丑陋,看不惯)

异步编程

  1. 调用栈 vs 事件驱动
  2. Future
    1. new File('a.txt').open().then(processFile);
    2. processFile(RandomAccessFile file){ file.length().then( (int len){ file.read(len).then(readFile).whenComplete( ... ) }); }
    3. catchError
    4. mirotask:优先于event被event-loop执行
    5. 推迟:new Future.delayed(new Duration(seconds:1), computation).then( (ret)=>print(ret) );
  3. Zones
    1. 一种可配置的执行上下文,用于处理异步任务和未捕获的异常:runZoned((){...}, onError: (e){...});
      1. zoneValues: ...
      2. zoneSpecification: ...
      3. 重载run以跟踪zone的执行:
        1. print: (Zone self, ZoneDelegate parent, Zone zone, String msg){...}, run: (Zone self, ZoneDelegate parent, Zone zone, f) => run(parent, zone, f, timer) //这里的代码有点难以理解,比如self与zone的区别?
  4. Isolates:可以认为是单独的进程(不共享数据,仅通过复制的消息通信)
    1. 代码略... 并发:每秒24000请求??

Stream框架

  1. new File().openRead().pipe(request.response);
  2. 单个订阅 vs 广播
  3. Stream类(有点LINQ的味道)
    1. 验证方法:any every contains
    2. 搜索:firstWhere lastWhere singleWhere
    3. 过滤:where skip skipWhere take takeWhere

下略(Stream无非就是FP里惰性序列的应用)

Collection框架

  1. The Lazy Iterable(这个例子似乎不太恰当?)
  2. SplayTreeSet?(见鬼,Java里的TreeSet也是用Splay树实现的吗)
  3. Unmodifiable集合:不是Scala里的Immutable集合,仅仅在API级别做了运行时限制而已

Dart与JavaScript互操作

  1. with jQuery:JProxy
  2. dart:js
    1. 性能测试的例子很扯淡,我严重怀疑下面这个语句的真正实现:container.appendHtml('
      Test
      ');

国际化和本地化

  1. Intl库

C/S通信

  1. dart:io HttpClient
  2. dart:html DivElement?
  3. Ajax polling(这个已经有点落伍了,不直接用WebSocket吗)
  4. SSE(tooold)
  5. WebSocket(基于TCP,但使用HTTP完成握手)

高级存储

  1. Cookies
  2. Web Storage
  3. Web SQL
  4. IndexdDB

支持其他HTML5特性

  1. 通知
  2. 原生拖放
  3. geolocation
    1. 对哦,为什么不能让用户直接指定位置作为输入呢,非得依赖什么GPS
  4. Canvas

安全

  1. TLS
  2. CAPTCHA 
0 0