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.cvtooltip.js 基于jquery的气泡提示插件
Nov 19 Javascript
也说JavaScript中String类的replace函数
Sep 22 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
May 23 Javascript
jQuery操作CheckBox的方法介绍(选中,取消,取值)
Feb 04 Javascript
js单词形式的运算符
May 06 Javascript
如何消除inline-block属性带来的标签间间隙
Mar 31 Javascript
jQuery简单设置文本框回车事件的方法
Aug 01 Javascript
详解使用vue实现tab 切换操作
Jul 03 Javascript
详解webpack 入门与解析
Apr 09 Javascript
使用vuepress搭建静态博客的示例代码
Feb 14 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
Feb 27 Javascript
详解关于React-Router4.0跳转不置顶解决方案
May 10 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
php实现根据字符串生成对应数组的方法
2014/09/22 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
Laravel+jQuery实现AJAX分页效果
2016/09/14 PHP
PHP实现的mysql读写分离操作示例
2018/05/22 PHP
laravel框架与其他框架的详细对比
2019/10/23 PHP
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
JS 对象介绍
2010/01/20 Javascript
js中的this关键字详解
2013/09/25 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
javascript实现验证IP地址等相关信息代码
2015/05/10 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
npm国内镜像 安装失败的几种解决方案
2017/06/04 Javascript
用node开发并发布一个cli工具的方法步骤
2019/01/03 Javascript
在微信小程序中保存网络图片
2019/02/12 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
python获取网页状态码示例
2014/03/30 Python
详解Python中的Descriptor描述符类
2016/06/14 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
python pandas读取csv后,获取列标签的方法
2018/11/12 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
pandas删除指定行详解
2019/04/04 Python
Python绘制堆叠柱状图的实例
2019/07/09 Python
Python实现加密接口测试方法步骤详解
2020/06/05 Python
python subprocess pipe 实时输出日志的操作
2020/12/05 Python
美国南加州的原创极限运动潮牌:Vans(范斯)
2016/08/05 全球购物
函授自我鉴定范文
2014/02/06 职场文书
2014年光棍节活动策划方案(创意集锦)
2014/09/29 职场文书
公司新员工欢迎词
2015/09/30 职场文书
学校教师培训工作总结
2015/10/14 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
小学记事作文之200字
2019/08/06 职场文书
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS