首页 >公司新闻

简单还是一致

发布时间:2013-08-13     发布者:本地    

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

一段代码的两种理解(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更多的则是需要“查阅”。

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

上一篇:两起“蝴蝶效应”Cases 下一篇:CSS学习之我观

相关新闻