拥抱模块化的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 相关文章推荐
jQuery的$.proxy()应用示例介绍
Apr 03 Javascript
JQuery下拉框应用示例介绍
Apr 23 Javascript
js实现类似新浪微博首页内容渐显效果的方法
Apr 10 Javascript
React.js入门实例教程之创建hello world 的5种方式
May 11 Javascript
详解使用webpack打包编写一个vue-toast插件
Nov 08 Javascript
详解mpvue开发小程序小总结
Jul 25 Javascript
使用angular-cli webpack创建多个包的方法
Oct 16 Javascript
基于axios 的responseType类型的设置方法
Oct 29 Javascript
vue使用swiper实现中间大两边小的轮播图效果
Nov 24 Javascript
JavaScript中window和document用法详解
Jul 28 Javascript
如何用JavaScript学习算法复杂度
Apr 30 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 APC配置文件2套和参数详解
2014/06/11 PHP
php中mt_rand()随机数函数用法
2014/11/24 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
简单的js分页脚本
2009/05/21 Javascript
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
jQuery实现长文字部分显示代码
2013/05/13 Javascript
纯文字版返回顶端的js代码
2013/08/01 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
用javascript关闭本窗口不弹出询问框的方法
2014/09/12 Javascript
AnjularJS中$scope和$rootScope的区别小结
2016/09/18 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
2017/03/30 jQuery
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
微信小程序实现红包雨功能
2018/07/11 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
移动端如何用下拉刷新的方式实现上拉加载
2018/12/10 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
JavaScript工具库MyTools详解
2020/01/01 Javascript
JS指定音频audio在某个时间点进行播放
2020/11/28 Javascript
在Python的Django框架中编写错误提示页面
2015/07/22 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
python中的for循环
2018/09/28 Python
对python修改xml文件的节点值方法详解
2018/12/24 Python
西班牙最好的在线购买葡萄酒的商店:Vinoseleccion
2019/10/30 全球购物
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
应届生个人求职信模板
2013/11/26 职场文书
高校教师自荐信范文
2014/03/13 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
行政二审代理词
2015/05/25 职场文书
周恩来的四个昼夜观后感
2015/06/03 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis
Python装饰器详细介绍
2022/03/25 Python