冒号和他的学生们(连载11)——切面范式

切面范式

横看成岭侧成峰           ——《苏轼·题西林壁》

引号重开话题:“OOP方兴未艾,AOP又开始崭露头角。AOP算是OOP的一种分支、一种补充还是一种超越?”

叹号故作捶胸顿足状:“OOP还没有完全吃透,又来了个什么AOP。”

“不同的人对新生事物采取不同的态度。”冒号王顾左右而言他,“追星族倾向于盲目追捧,唯恐落伍,他们信奉新潮的流行的就是好的;守旧派倾向于本能抗拒,回避求新,他们认为经典的传统的才是好的。”

引号和叹号互视一眼,不情愿地戴上了老冒派发的帽子。

冒号续道:“从宏观角度看,太阳底下没有新鲜事——AOP无非是SoC原理和DRY原则的一种应用;从微观角度看,太阳每天都是新的——AOP虽自OOP的土壤中长出,却脱离藩篱自成一体,并且嫁接到非OOP的领地,不仅在纯过程式语言、函数式语言、甚至逻辑式语言中得到发展,而且本身也具备了一定的声明式语言特征,成为一种新的软件模块化方式。”

问号举手:“什么是SoC和DRY?”

引号代答:“SoC就是Separation of concerns,即关注点分离;DRY是Don’t Repeat Yourself,即尽量减少重复代码。”

“答案正确,加十分!”冒号戏赞道,“不良代码通常有两种病征:一是纷乱如麻,纠缠打结,可谓剪不断理还乱;二是叠床架屋,臃肿不堪。治疗此类病症一个有效的方法是抽象与分解:从问题中抽象出一些关注点,再以此为基础进行分解。分解后的子问题主题鲜明并且独立,不会牵一发而动全身。同时具有相同特征的部分可以象代数中的公因子一样提取出来,减少了代码重复。”

句号醒悟道:“这不就是模块化吗?”

“准确地说,抽象是前提,分解是方式,模块化是结果。”冒号很讲究精确,“大家记得庖丁解牛的故事吧?在常人眼中复杂的牛体,庖丁经过抽象,已目无全牛,及至提刀分解,自是游刃有余。待牛如土委地,模块化既成。”

句号举一反三:“前面提到的编程范式的基本思想大多不也如此?将程序分别抽象分解为过程、函数、断言、对象和进程,就依次成为过程式、函数式、逻辑式、对象式和并发式。至于泛型式——”

句号讲不下去了。

“泛型式虽未引入新类型的模块,其核心也是抽象出算法后与数据分解。”冒号为其解围,“以此类推,切面式的AOP将程序抽象分解为切面。”

问号提问:“抽象与分解的原则是什么?”

冒号作了个V字:“两条:单一化,正交化。每个模块职责明确专一,模块之间相互独立,即高聚合低耦合(high cohesion & low coupling)。此原则相当普适,是分析复杂事物的一种基本方法,在数学和物理中应用得尤为广泛,如质因式分解、正交分解、谱分解等等。”

逗号调皮地抬杠:“为什么称为正交化呢?斜交化不行吗?”

冒号呵呵一笑:“互为正交的两个向量在彼此方向上投影为零,意味着彼此独立,互不影响,斜交可不行。”

逗号吐了吐舌头。

“诚如前述,AOP以切面为模块。”冒号返回主题,“切面Aspect常直译为‘方面’,但它描述的是横切关注点(Cross-cutting concerns),故‘切面’更准确生动,而‘方面’则失之空泛呆板。何谓横切关注点?顾名思义,乃是与程序的纵向主流执行方向横向正交的关注焦点。不妨回顾一下,无论是过程式的函数,还是对象式的方法,都包含了完整的执行代码。但有些代码横跨多个模块,以片断的形式散落在各处,虽具有相似的逻辑,却无法用传统的方式提炼成模块,难以实现SoC与DRY。典型的例子如:在调用某些对象的方法、读写某些对象的域、抛出某些异常等等前后,需要用到统一的业务逻辑,诸如日志输出、代码跟踪、性能监控、异常处理、安全检查、事务管理等等。为解决此类问题,AOP应运而生。它将每类横切关注点封装到单独的Aspect模块中,将程序中的一些执行点与相应的代码绑定起来。单个的执行点称为接入点(join point),例如:调用某个对象的方法前后;符合预先指定条件的接入点集合称为切入点(pointcut),例如:所有以set为命名开头的方法;每段绑定的代码称为一个建议(advice)。”

时间: 2024-10-16 05:14:48

冒号和他的学生们(连载11)——切面范式的相关文章

冒号和他的学生们(连载22)——抽象思维

22.抽象思维 是谓无状之状,无物之象,是谓惚恍 --<老子·道经> 冒号健步走进教室,学员们立刻正襟危坐,进入战备状态. "如果说咱们是在合演一场戏,那么前面五节课只是一个过门."冒号俨然一副自导自演的架势. 众人暗暗吃惊:这过门也忒长了点吧. 冒号随即探问:"还记得在范式总结中提到的迭代学习法吧?" 引号迅速应答:"就是在具体知识与抽象理论之间做折返跑." "记性不错."冒号赞道,"在上本班之前,你们

冒号和他的学生们(连载10)——超级范式

超级范式 智能繁衍:机器人生产机器人 --题记 引号忽然想起一事,问道:"有一本名为<C++模版元编程>的书,既然提到了模板,想来也属于泛型编程吧?" 冒号答道:"模板元编程即Template Metaprogramming,与GP密切相关但自成一派,隶属于另一种编程范式--元编程(Metaprogramming),简称MP.这里的前缀'meta-'常译作'元',其实就是'超级'.'行而上'的意思.比如,元数据(Metadata)是关于数据的数据,元对象(Meta

冒号和他的学生们程序员提高班纪事系列

冒号和他的学生们(连载27)--接口服务 冒号和他的学生们(连载26)--访问控制 冒号和他的学生们(连载25)--软件应变 冒号和他的学生们(连载24)--对象封装 冒号和他的学生们(连载23)--数据抽象 冒号和他的学生们(连载22)--抽象思维 冒号和他的学生们(连载21)--后台脚本 冒号和他的学生们(连载20)--前台语言 冒号和他的学生们(连载19)--平台语言 冒号和他的学生们(连载18)--系统语言 冒号和他的学生们(连载17)--语言讨论 冒号和他的学生们(连载16)--动态语

冒号课堂§3.3:切面范式

第三课 常用范式(3) 3.3 切面范式--多角度看问题 横看成岭侧成峰 --<苏轼·题西林壁> 关键词:编程范式,SoC,DRY,AOP,Aspect,join point,pointcut,advice,OOP 摘要:AOP简谈 ?提问 什么是SoC和DRY? 如何有效地避免紊乱.松散.重复的代码? 抽象与分解的原则是什么? 什么是横切关注点? 接入点与切入点有何区别? 什么是编织?有哪些不同的编织方法? 实施AOP有哪些步骤? 为什么说AOP是OOP的一种补充? 为什么提倡尽可能地阅读原

《低功耗蓝牙开发权威指南》——2.11节范式

2.11 范式 最成功的技术常围绕不同的范式而设计,低功耗蓝牙也不例外.低功耗蓝牙技术使用两个主要的架构范式:客户端–服务器架构和面向服务的架构. 2.11.1 客户端–服务器架构 在客户端–服务器架构中,客户端通过网络向服务器发送请求,服务器回复响应.这是互联网背后的主要范式,无疑也是有史以来发布的最成功的网络技术. 举个例子,当你在Web浏览器中键入一个URL地址时,它首先发送地址到DNS服务器.DNS服务器将已分配给该名称的对应的IP地址返回.然后,客户端通过超文本传输协议(HTTP)向服

冒号和他的学生们(连载9)——泛型范式

泛型范式 算法是脊,数据是肉:思想是鸡,结论是蛋 --题记 冒号重新开讲:"你们会不会经常遇到这种情景:一遍又一遍地写着相似的代码,有心将其归并,却因种种原因无法践行." 逗号心有戚戚焉道:"是啊,有时明明两个函数的实现几乎一模一样的,就因为某些参数不匹配,无法合而为一." "有一种编程范式可以解决这个问题,它打破了不同数据结构之间的壁垒,让你的代码不再臃肿,这--就是泛型编程."冒号的语调和说辞不免令人联想到电视上的减肥广告,"Gen

冒号和他的学生们(连载1)——开班发言

开班发言 授人以鱼不如授人以渔 --古语 冒号开了个程序员提高班,今天迎来了首期学员,他们是问号.句号.逗号.引号和叹号,皆为IT业的新兵.望着台下洋溢着青春与渴望的脸庞,冒号开始了他的开班发言-- 大家好!先自我介绍一下,本人姓冒名号字解之.诸位不必叫我老师,就叫老冒好了.比在座各位痴长几岁,"老"是担得的,"师"却不敢妄言.在下编程多年,自觉小有所成,不敢专藏,特开此班与众共享.虽系一家之言.一孔之见,若能抛砖引玉,又何惧方家之哂?疏谬之处,还望海涵斧正,不致自

冒号和他的学生们(连载2)——首轮提问

首轮提问 敬畏老师莫如敬畏真理 --题记 众人面面相觑,一阵沉默后开始窃窃私语,显然有些不太习惯这种教学方式--笔记本上还没写两个字呢,老师就把球给踢回来了. 冒号也不说话,只是微笑地望着大家. 还是问号打破僵局,开始发问:"老师--" 冒号扬手打断他:"这里没有老师,唯一的老师是你自己.本班的一个特色是:师生角色模糊,大家自主学习,相互启发,教学相长." 问号顿了顿:"老冒--"全班哄堂大笑,"学软件开发,当然得先学语言,计算机语言这

冒号和他的学生们(连载27)——接口服务

27.接口服务 律己宜严,待人宜宽 --<洪应明·菜根谭> 叹号幡然反省:"以前我们做OOP编程时,总是专注于如何利用其他类来解决问题,而较少考虑自己设计的类对其他类的影响." 引号翻开以前的笔记:"前面提过,OOP的世界是民主制的,所有对象都是独立而平等的公民,有权利寻求服务,也有义务提供服务.看来我们是光惦着权利而忘了义务了." 冒号继而提出:"作为服务的提供者,最重要的是讲诚信.首先,服务要有可靠性,不能阳奉阴违--即接口必须履行它的承诺