拥抱模块化的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 相关文章推荐
TFDN图片播放器 不错自动播放
Oct 03 Javascript
jquery实现更改表格行顺序示例
Apr 30 Javascript
html的DOM中document对象images集合用法实例
Jan 21 Javascript
详解JavaScript权威指南之对象
Sep 27 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
Aug 17 jQuery
Angular CLI 安装和使用教程
Sep 13 Javascript
详解使用vue-admin-template的优化历程
May 20 Javascript
js for终止循环 跳出多层循环
Oct 04 Javascript
JS实现倒计时图文效果
Nov 17 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
Jul 25 Javascript
微信小程序仿淘宝热搜词在搜索框中轮播功能
Jan 21 Javascript
Vue proxyTable配置多个接口地址,解决跨域的问题
Sep 11 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 前一天或后一天的日期
2008/06/28 PHP
PHP基础知识介绍
2013/09/17 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
PHP的介绍以及优势详细分析
2019/09/05 PHP
捕获关闭窗口的脚本
2009/01/10 Javascript
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
JavaScript截取指定长度字符串点击可以展开全部代码
2015/12/04 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
js实现单张图片平移切换效果
2017/10/11 Javascript
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
微信小程序后端实现授权登录
2020/02/24 Javascript
JavaScript正则表达式验证登录实例
2020/03/18 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
基于ant design日期控件使用_仅月份的操作
2020/10/27 Javascript
Vertx基于EventBus发送接受自定义对象
2020/11/16 Javascript
python数据结构之二叉树的遍历实例
2014/04/29 Python
Python使用scrapy抓取网站sitemap信息的方法
2015/04/08 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
2019/04/05 Python
python pillow模块使用方法详解
2019/08/30 Python
python实现计算器功能
2019/10/31 Python
python中Mako库实例用法
2020/12/31 Python
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
Melijoe时尚童装德国官网:Melijoe德国
2016/09/03 全球购物
GUESS西班牙官方网上商城:美国服饰品牌
2017/03/15 全球购物
美国时尚在线:Showpo
2017/09/08 全球购物
会计专业个人求职信范文
2014/01/08 职场文书
小学生安全演讲稿
2014/04/25 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
服务理念标语
2014/06/18 职场文书
鸟的天堂导游词
2015/01/31 职场文书
业务内勤岗位职责
2015/04/13 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
《中国机长》观后感:敬畏生命,敬畏职责
2019/11/12 职场文书