服务与支持 |咨询热线 0931-8733767
  • 金城在线
  • 公司简介
  • 发展历程
  • 企业文化
  • 售后服务
  • 工作机会
  • 联系我们

简单还是一致

来源:发布时间:2018-3-12 9:29:54

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


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


看这段代码:


```js

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的简单性吗?本来是一个小功能出问题,导致整个页面瘫痪掉,这种架构当然有问题。


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


```js

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)

看这段代码:


```js

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

```


这段代码有两种理解


1、我想依次执行`a.js`,`b.js`,`c.js`,这时a、b、c之间有依赖。


2、我想尽快执行`a.js`、`b.js`、`c.js`的代码,三者无依赖。


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

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

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

```js

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

sequential: false // 不要顺序执行a,b,c

});

```


问题又来了,seajs默认三者之间无依赖。如果真有呢?同样,seajs的“一致性”隐藏了这个配置信息。

小结

其实,代码所蕴含的信息,不会因为代码量减少而减少。代码过于简洁,就需要额外的“规约”来传达这些重要信息。“黄金法则”中提到的“简单性”就是指约定,约定共识,做事才会简单。其中提到的“完整性”是指的底层机制的健壮,说的直白一点就是面向场景的设计。


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


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


相关文章
  • 预约专家

    为您提供一对一解决方案
    立即预约
  • 售前咨询

    周一至周五9:00——17:30
    立即咨询
  • 联系方式

    13919049954

    全国7×24小时热线服务
  • 免费报价

    专属专业顾问1对1报价
    免费报价