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 相关文章推荐
javascript 对表格的行和列都能加亮显示
Dec 26 Javascript
javascript 解决表单仍然提交即使监听处理函数返回false
Mar 14 Javascript
通过继承IHttpHandle实现JS插件的组织与管理
Jul 13 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
Aug 27 Javascript
JavaScript中的方法重载实例
Mar 16 Javascript
Select下拉框模糊查询功能实现代码
Jul 22 Javascript
浅谈js的异步执行
Oct 18 Javascript
详解AngularJS ng-class样式切换
Jun 27 Javascript
vue打包后显示空白正确处理方法
Nov 01 Javascript
vue项目中使用ueditor的实例讲解
Mar 05 Javascript
JS实现压缩上传图片base64长度功能
Dec 03 Javascript
vue中keep-alive、activated的探讨和使用详解
Jul 26 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分页显示制作详细讲解
2006/12/05 PHP
php仿discuz分页效果代码
2008/10/02 PHP
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
PHP数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
网页自动跳转代码收集
2009/09/27 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
设置checkbox为只读(readOnly)的两种方式
2013/10/11 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
JavaScript设计模式之单件模式介绍
2014/12/28 Javascript
JavaScript中string转换成number介绍
2014/12/31 Javascript
浅谈js中的闭包
2015/03/16 Javascript
javascript带回调函数的异步脚本载入方法实例分析
2015/07/02 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
JS实现星星海特效
2019/12/24 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
python元组操作实例解析
2014/09/23 Python
python中子类调用父类函数的方法示例
2017/08/18 Python
Python 列表理解及使用方法
2017/10/27 Python
Python面向对象之继承代码详解
2018/01/29 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
Python 字符串、列表、元组的截取与切片操作示例
2019/09/17 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
2020/02/11 Python
Python如何在循环内使用list.remove()
2020/06/01 Python
python如何快速生成时间戳
2020/07/21 Python
行政文秘岗位职责范本
2014/02/10 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
Redis做数据持久化的解决方案及底层原理
2021/07/15 Redis
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers
Android Studio 计算器开发
2022/05/20 Java/Android