到底是谁的bug?聊聊模块化

2016-12-24 11:55:00


从前有一程序员,

每天被无数bug折磨,于是跑到山上拜访智者。



640.webp (6).jpg





程序员问:有没有一种办法,能让我写出来的代码完美无瑕,永无bug呢?

智者答:没有。除非。。。

程序员:除非什么?

智者:除非你能让那些产品经理,不要总提些奇奇怪怪的需求。

程序员:啊,那太难了。退一步,有没有一种办法,能让我写出来的代码,即使有bug,也能立刻知道bug出在哪儿?

智者:也没有。除非。。。

程序员:我的天,你们山里人都喜欢把话说一半吗?

智者:除非,你在一开始写代码的时候,就考虑到了「模块化」。

程序员恍然大悟。



640.webp (7).jpg


模块化



模块化是软件工程里的一个概念,

讲的是要把一个大的项目拆解成很多模块,

每个模块实现一个小功能。

模块的内部是封闭的,

外面只能看到它的入口和出口。

入口多就意味着模块用起来复杂,

这样你即使把模块做出来,别人也不乐意用。




640.webp (8).jpg





我们一开始写程序的时候,

其实是没有模块的概念的。比如C语言,

要实现一个功能,一条路从头走到尾,直到最后输出结果。这样的问题是如果最后运行出bug了,你需要再把整个流程重新捋一遍,定位的时候非常痛苦。




640.webp (9).jpg



后来大家开始写函数,

算是迈出了模块化的一小步。

再后来,有了面向对象的语言,

人们把很多函数和一些用到的数据放到

一个类里面封装起来,形成了一个大模块。

谁办事不给力,就找哪个类,这样查bug就更好查了。再往上走,把实现某个功能的所有类放在一起,做成一个大模块。




模块化的思想就是这样,

大模块套小模块,

直到把一个项目拆解开。



640.webp (10).jpg



你做一个新闻客户端,首先,要有一个网络模块,这个可能需要很多类来共同完成,可以一起放在一个包里。然后,要有一个转换模块,从网上下载的新闻,是html格式的,你需要从html网页里提取出真正的新闻标题,新闻内容。最后,还有一个展示模块,只要把转换好的新闻塞进去,就能自动进行排版,优雅的展示出来。




这样模块的接口约定好之后,招三个程序员,并行工作,最后串起来,完工。模块化不光是为了找bug方便。程序员常说,我们不生产代码,我们只是github的搬运工,如果你的模块不如外国大神写的好,完全可以完整的替换掉,这就是所谓的可插拔的设计。




又或者,你现在要做一个论坛APP,那么之前新闻客户端里的网络模块,

也可以拿来直接用,实现所谓的代码重用,也是拜模块化所赐。





道理人人都会讲,

就看谁代码写的溜了。

写代码的时候,有几个点需要注意。




640.webp (11).jpg





一、模块内部不能对外面有影响




这个很好理解,别人用你的模块,你不能有副作用。典型的例子,ES6之前的javascript,没有模块的概念。即使是在函数里写的代码,也有可能一不小心就污染了全局系统。这是javascript一个很不好的特性,有经验的程序员都会避开。






二、真正用到模块的时候再去加载



模块是需要花时间加载的,比如java里面的类,需要虚拟机把代码加载到内存里经过一番处理才能用。再比如网站上用到的javascript代码,不同的模块属于不同的文件,需要去网上下载。如果你打开一个网站的时候,就把所有东西都下载好了,这个体验是很差的,会有很长时间的白屏。





其实这样看来,模块化说难也不难。



难的是什么呢?是你做一个项目的时候,一开始没有考虑到模块化,到后来越来越庞大的时候,才想起来要搞模块化,这时候一方面代码太多整理起来太麻烦,另一方面产品又有新需求,两面夹击,容易力不从心。但是长痛不如短痛,为了改bug更方便,为了代码更容易重用,这个还是值得的。




640.webp (12).jpg


Keep IT Simple. 让信息技术更简单

联系我们
400-0800-5580551-62837292
在线服务
QQ:3020438181
我们在这儿
本部:合肥市高新区科学大道5f创业园B座2楼 上海办事处:上海浦东南路100号民生大厦38层 南京办事处:南京市燕江路201号数码港235室

COPYRIGHT © 2018 Simpo辛普科技  皖ICP备14019348号-2  ISO27001:2016信息安全认证