简单还是一致(续) #140

Open
jayli opened this Issue · 7 comments

6 participants

lijing00333 偏右 tangoboy Jeff army8735 star
lijing00333

1013990952e91f73aa

前不久发了一篇文章:简单还是一致,引起了不少热议。淘宝前端工程师拔赤就此总结了一篇文章,非常值得思辩。全文如下。


一段代码的两种理解(1)

看这段代码:

seajs.use('a', function(A) {
  A.doSth();
  console.log('a');
});

// some logic...

seajs.use('b', function(B) {
  B.doSth();
  console.log('b');
});

问题来了,我们想象这段代码出现在淘宝首页,淘宝首页的结构是被分割为很多个“区块”,每个“区块”由不同业务线中的同学开发维护,他们之间互不知晓,最终首页是被“拼凑”而成的。那么这个例子中,若A的代码报错,会不会影响B的代码?

按照玉伯的设计,因为同步执行回调,当然会影响。怎么办?淘宝首页架构师要call正在休假的A让他去改A.doSth()的逻辑以适应seajs的简单性吗?

本来是一个小功能出问题,导致整个页面瘫痪掉,这种架构当然有问题。

这段代码真实的语义应当是:

seajs.use('a', function(A) {
  A.doSth();
  console.log('a');
}, {
  async: true // 异步执行callback
})

// some logic...

seajs.use('b', function(B) {
  B.doSth();
  console.log('b');
}, {
  async: false // 同步执行callback
})

seajs的“一致性”隐藏了这个重要的配置。

一段代码的两种理解(2)

看这段代码:

seajs.use('a', 'b', 'c', callback)

这段代码有两种理解

  • 我想依次执行a.jsb.jsc.js,这时a、b、c之间有依赖
  • 我想尽快执行a.jsb.jsc.js的代码,三者无依赖

对于第一种情况,三段代码的加载顺序无要紧,只要三者顺序执行即可,这和浏览器中写入script标签一样。

对于第二种情况,因为有“约定”三者无依赖,每段js代码加载完成后立即执行。

a.jsb.jsc.js之间到底有无依赖,在这段代码中是看不出来的。其实上段代码的真实语义其实等同于

seajs.use('a', 'b', 'c', callback, {
  sequential: false // 不要顺序执行a,b,c
});

问题又来了,seajs默认三者之间无依赖。如果真有呢?

同样,seajs的“一致性”隐藏了这个配置信息。

小结

其实,代码所蕴含的信息,不会因为代码量减少而减少。代码过于简洁,就需要额外的“规约”来传达这些重要信息。

“黄金法则”中提到的“简单性”就是指约定,约定共识,做事才会简单。其中提到的“完整性”是指的底层机制的健壮,说的直白一点就是面向场景的设计。

这时,seajs就和旧有的类库有所不同,seajs提供“方法”和“思路”,而jquery、yui、mootools等则提供“工具”。两种思路直接决定了类库所面向的“问题集合”。因此,seajs需要“学习”,而jquery更多的则是需要“查阅”。

对于具体的场景来说,“一致”的约定难免单薄,相比之下,“工具”则更易于被大众接受。理论最终是要和业务结合,这也是为什么一个“懂”业务的框架看起来不美的原因。“懂业务”带来的复杂性和“强约定”带来的优雅的编程体验,两者之间,你会选择哪个?

(完) 文 / 拔赤

题图:很漂亮的三片叶子。对于叶子,你喜欢简单,还是一致?抑或复杂?


欢迎订阅 WTP(Web 技术与产品交流)微信公众帐号。WTP 关注技术、产品、自由梦,在每个工作日(偶尔休息日)会定期推送一篇原创文字。欢迎扫描二维码订阅: