13919049954

简单还是一致

作者:金城在线 日期:2018/3/12 9:29:54 人气:312

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


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


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


            金城在线专注网站、软件、APP、微信公众平台、小程序、抖音、头条等开发推广,如果您有这方面的需求或者不同的观点,欢迎联系交流。

    官方微信

    本文网址:http://lz.net.cn/zixunzhongxin/764.html
    读完这篇文章后,您心情如何?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    更多>>网友评论
    发表评论