拥抱模块化的JavaScript


Posted in Javascript onMarch 07, 2012

我们再一次被计算机的名词,概念笼罩。
backbone、emberjs、spinejs、batmanjs 等MVC框架侵袭而来。
CommonJS、AMD、NodeJS、RequireJS、SeaJS、curljs等模块化的JavaScript扑面而来。
模块化JavaScript的概念尤为强烈,似乎有赶超07年Ajax风潮之趋势。
一、写函数(过程式)
2005年以前,JavaScript没人重视,只作为表单验证等少量应用。那时一个网页上写不了几行JS代码,1000行算很复杂了。这时组织代码的方式是过程时,几十行的代码甚至连一个函数都不用写。稍多的需要提取抽象出一个函数,更复杂一些则需要更多函数,函数间互相调用。

二、写类(面向对象)
2006年,Ajax席卷全球。JavaScript被重视了,越来越多的后端逻辑放到了前端。网页中的JS代码量急剧增加。这时写函数方式组织大量代码显得力不从心。有时调试一个小功能,从一个函数可能会跳到第N个函数去。这时写类的方式出现了,Prototype 率先流行开来。用它组织代码,写出的都是一个个类,每个类都是Class.create创建的。又有YUI、Ext等重量级框架。虽然它们的写类方式各不同,但它们的设计思路却都是要满足大量JavaScript代码的开发。

三、写模块(现在,未来?)
2009年,Nodejs诞生!这个服务器端的JavaScript采用模块化的写法很快征服了浏览器端的JSer。牛人们纷纷仿效,各种写模块的规范也是层出不穷。CommonJS想统一前后端的写法,AMD则认为自己是适合浏览器端的。好吧,无论写模块的风格是啥样,写模块化的JavaScript却已开始流行了。准备好了吗?(呃具煽动性)

呵,模块化的JavaScript是啥? 这是我们发明了又一个银弹吗?无论是啥,就当学习吧。至于适不适合项目中使用,各自斟酌。

写到这也没说什么是“模块”。其实在计算机领域,模块化的概念被推崇了近四十年。软件总体结构体现模块化思想,即把软件划分为一些独立命名的部件,每个部件称为一个模块,当把所有模块组装在一起的时候,便可获得问题的一个解。

模块化以分治法为依据,但是否意味着我们把软件无限制的细分下去。事实上当分割过细,模块总数增多,每个模块的成本确实减少了,但模块接口所需代价随之增加。要确保模块的合理分割则须了解信息隐藏,内聚度及耦合度。

信息隐藏
模块应设计的使其所包含的信息(过程和数据)对于那些不需要用到它的模块不可见。每个模块只完成一个独立的功能,然后提供该功能的接口。模块间通过接口访问。JavaScript中可以用函数去隐藏,封装,而后返回接口对象。如下是一个提供事件管理的模块event。

event = function() { 
// do more 
return { 
bind: function() {}, 
unbind: function() {}, 
trigger: function() {} 
}; 
}();

函数内为了实现想要的接口bind、unbind、trigger可能需要写很多很多代码,但这些代码(过程和数据)对于其它模块来说不必公开,外部只要能访问接口bind,unbind,trigger即可。

信息隐藏对于模块设计好处十分明显,它不仅支持模块的并行开发,而且还可减少测试或后期维护工作量。如日后要修改代码,模块的隐藏部分可随意更改,前提是接口不变。如事件模块开始实现时为了兼容旧版本IE及标准浏览器,写了很多IE Special代码,有一天旧版本IE消失了(猴年马月),只需从容删去即可。

内聚度
内聚度指模块内部实现,它是信息隐藏和局部化概念的自然扩展,它标志着一个模块内部各成分彼此结合的紧密程度。好处也很明显,当把相关的任务分组后去阅读就容易多了。
设计时应该尽可能的提高模块内聚度,从而获得较高的模块独立性。

耦合度
内聚度是指特定模块内部实现的一种度量,耦合度则是指模块之间的关联程度的度量。耦合度取决于模块之间接口的复杂性,进入或调用模块的位置等。与内聚度相反,在设计时应尽量追求松散耦合的系统。

Javascript 相关文章推荐
JXTree对象,读取外部xml文件数据,生成树的函数
Apr 02 Javascript
JQuery 学习笔记 选择器之二
Jul 23 Javascript
js展开闭合效果演示代码
Jul 24 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
Sep 03 Javascript
点击页面任何位置隐藏div的实现方法
Sep 05 Javascript
原生JavaScript实现的简单省市县三级联动功能示例
May 27 Javascript
babel的使用及安装配置教程
Feb 22 Javascript
使用pm2自动化部署node项目的方法步骤
Jan 28 Javascript
Element-UI中Upload上传文件前端缓存处理示例
Feb 21 Javascript
基于Vue插入视频的2种方法小结
Apr 02 Javascript
vue中使用GraphQL的实例代码
Nov 04 Javascript
一篇文章带你浅入webpack的DLL优化打包
Feb 20 Javascript
那些年,我还在学习jquery 学习笔记
Mar 05 #Javascript
什么是DOM(Document Object Model)文档对象模型
Mar 05 #Javascript
JQuery魔力之$("tagName")与selector
Mar 05 #Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
Mar 04 #Javascript
Javascript实现DIV滚动自动滚动到底部的代码
Mar 01 #Javascript
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
Mar 01 #Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
Mar 01 #Javascript
You might like
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
关于IE7 IE8弹出窗口顶上
2008/12/22 Javascript
ie 调试javascript的工具
2009/04/29 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
2013/03/11 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
QQ空间顶部折页撕开效果示例代码
2014/06/15 Javascript
了不起的node.js读书笔记之node.js中的特性
2014/12/22 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
jquery平滑滚动到顶部插件使用详解
2017/05/08 jQuery
vue-cli中的webpack配置详解
2017/09/25 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
vue.js中created方法作用
2018/03/30 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
深入理解javascript中的this
2021/02/08 Javascript
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
高质量Python代码编写的5个优化技巧
2017/11/16 Python
python爬虫获取京东手机图片的图文教程
2017/12/29 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
python怎么提高计算速度
2020/06/11 Python
利用Python的folium包绘制城市道路图的实现示例
2020/08/24 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
小蚁科技官方商店:YI Technology
2019/08/23 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
网站设计师的岗位职责
2013/11/21 职场文书
责任胜于能力演讲稿
2014/05/20 职场文书
小学班主任评语
2014/12/29 职场文书
行政复议决定书
2015/06/24 职场文书
工作简报范文
2015/07/21 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL