yui3的AOP(面向切面编程)和OOP(面向对象编程)


Posted in Javascript onMay 01, 2015

首先请把手放胸前成沉思状:我上了生活,还是被生活上了自己?

没想出答案把,恩,可以读下文了。从语义角度讲,同一事物的不同表述可以反映人的主观视角的不同,从哲学角度将,世界观影响方法论,我们看事物的角度不同,有时会得出截然相悖的结论,从而会影响我们的做事方式和行为准则,现实生活如此,在丰富多彩的编程语言中更是如此,编程模式充满了对现实世界的各种模拟,包括是面向过程,面向对象,还有面向切面。我们大概已经非常熟悉面向过程和面向对象,切面的英文是Aspects(有时译作方面,我感觉用切面更能贴切的表达Aspects的内涵)。

有关AOP的链接看这里:
http://en.wikipedia.org/wiki/Aspect-ori ... rogramming

YUI3中的自定义事件实现了AOP
http://developer.yahoo.com/yui/3/event

什么是切面?举个简单的例子,每天我们上下班挤地铁坐公交和女朋友约会上网吧打游戏去电影院看电影……,一天要做很多事情,每个人都是一个Object,我们做的每件事情都是这个Object的方法,比如,

甲.上班();
乙.坐地铁();
丙.看电影();

其实可以换个角度看,公司需要员工来上班,轨道交通需要每个人去乘坐,电影院给每个人放电影。这样就变成了:

公司.need(甲)
地铁.carry(乙);
电影院.放电影给(丙);

这样看来,不仅甲乙丙每个个体都是一个对象,公司、地铁、电影院也是对象,这种抽象就是传统的面向切面。而在js编程中,程序一般都不大,所以大概不会到达非要使用切面级别的抽象的程度。但其基于事件驱动的原理则很容易让人联想到AOP,上个例子在js中就可能是:

someone.dosth();//OOPobject.fire('event',someone);//AOP

如果脱离上下文来看,上面的代码依然语义牵强。只是很多js框架把切面编程的边缘特性封装成方法,对人造成了很多误导。比如事件的绑定。当函数foo执行结束的时候执行myfoo,在不修改foo的基础上来添加对foo的监听,

var foo = function(){
  //some code here
};

jQuery.aop.after(foo,function(){
  //added code here
});

jquery和prototype都实现了这种简单的函数绑定。jquery的aop在这里。但在yui3中,AOP则被提升至自定义事件的一种内在机制,在源码中随处可见。这在理解yui3的代码重用机制是很有帮助的。也正是得益于这种抽象使得yui3的自定义事件异常强大和灵活。和OOP相比,AOP的优点是非侵入式的“装饰”,但在多数情况下,并不推荐首先使用AOP来写代码。来看这个例子:每个人的生活习惯很类似,这里用四种行为为例,上学,放学,泡妞,打游戏,甲的生活规律很正常,每种事件发生的概率是一样的,乙是个贪玩的小孩,只会去网吧打游戏和泡妞,丙是一个爱学习的小孩,从不泡妞和打游戏,丁是一个经历超级旺盛的另类,每次都是同时干两件事情,上学的时候泡妞,放学的时候打游戏。这里用div代表每个人,用onmouseover来触发每个事件。

用OOP的方法那么程序结构应该是这样:

yui3的AOP(面向切面编程)和OOP(面向对象编程)

代码在这里:yui_oop.htm

这里的"古怪人"继承自"正常人"的时候,是通过代码重写的方法来达到重载的目的,这里明显违反了非侵入性原则。再来看AOP的思路:

yui3的AOP(面向切面编程)和OOP(面向对象编程)

代码在这里:yui_aop.htm

这里抽象出了事件发布工厂,用来专门处理事件的发布,由其生成的生活轨迹对象对每个人进行监听,捕捉每个人的各种行为。工厂在生成‘古怪人生活轨迹'的时候使用了上文提到的函数的监听绑定,这种绑定是非侵入性的,可以很好的和工厂解耦。从这个例子中比较OOP和AOP,两者复杂度差不多,但AOP思路更开阔,代码也更灵活一些。

Javascript 相关文章推荐
jQuery ui1.7 dialog只能弹出一次问题
Aug 27 Javascript
15个款优秀的 jQuery 图片特效插件推荐
Nov 21 Javascript
基于jquery实现状态限定编辑的代码
Feb 11 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
May 19 Javascript
js内存泄露的几种情况详细探讨
May 31 Javascript
node.js中的console用法总结
Dec 15 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
Dec 13 Javascript
vue的基本用法与常见指令
Aug 15 Javascript
jQuery Validate插件ajax方式验证输入值的实例
Dec 21 jQuery
动态内存分配导致影响Javascript性能的问题
Dec 18 Javascript
解决vue单页面修改样式无法覆盖问题
Aug 05 Javascript
Vue中keep-alive的两种应用方式
Jul 15 Javascript
使用AOP改善javascript代码
May 01 #Javascript
Javascript aop(面向切面编程)之around(环绕)分析
May 01 #Javascript
jQuery插件Zclip实现完美兼容个浏览器点击复制内容到剪贴板
Apr 30 #Javascript
jQuery插件slider实现拖动滑块选取价格范围
Apr 30 #Javascript
javascript实现验证身份证号的有效性并提示
Apr 30 #Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
Apr 30 #Javascript
jquery实现键盘左右翻页特效
Apr 30 #Javascript
You might like
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
PHP开发中四种查询返回结果分析
2011/01/02 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
2017/07/03 PHP
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
node.js中watch机制详解
2014/11/17 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
jQuery 的 ready()的纯js替代方法
2016/11/20 Javascript
Less 安装及基本用法
2018/05/05 Javascript
详解微信小程序用定时器实现倒计时效果
2019/04/30 Javascript
JS实现网页时钟特效
2020/03/25 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
Python读取环境变量的方法和自定义类分享
2014/11/22 Python
自己使用总结Python程序代码片段
2015/06/02 Python
python基于multiprocessing的多进程创建方法
2015/06/04 Python
python实现批量下载新浪博客的方法
2015/06/15 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
Python hexstring-list-str之间的转换方法
2019/06/12 Python
Python 日期与时间转换的方法
2020/08/01 Python
Python切片列表字符串如何实现切换
2020/08/06 Python
浏览器实现移动端高性能css3动画(开启gpu加速)
2013/12/23 HTML / CSS
html特殊符号示例 html特殊字符编码对照表
2014/01/14 HTML / CSS
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
八年级生物教学反思
2014/01/22 职场文书
大学军训感想
2014/02/12 职场文书
商业房地产广告语
2014/03/13 职场文书
主办会计岗位职责
2014/03/13 职场文书
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
小学体育教学随笔
2015/08/14 职场文书
护士年终工作总结不会写?各科护士模板总结
2020/01/02 职场文书