记得在以前的博文中说过VS的智能提示就是AOP,被人耻笑过。今天就详细写写,名称就叫“渔鱼之辩”。
依现有的AOP的狭义定义,VS的智能提示不算AOP。正如,按新华字典上的解释,“操”不能算骂人的词。
为了探析VS的智能提示到底算不算AOP,先看看AOP的内涵:
·我们对系统有某一方面的关注
·这些关注分散在系统的多个地方
·通过某些技术或方法将这些关注点“织出”、“织入”以集中控制
看一个例子:
例子1:程序中的魔数
程序中魔数分散在系统的各数,将它们提出为 const 变量 或 static 变量以集中控制。
这算不算AOP呢?有点太轻量级了。正如蚯蚓的神经结不能称为大脑一样。
例子2:IDE的智能提示算不算AOP?
IDE的智能提示做了什么呢:
·我们关注类型的行为和它的字段
·类型有哪些行为或字段?这些知识分散在技术文档之中或者代码中或者我们的大脑中。
·IDE通过反射或Tag技术或其它技术将这些关注点集中起来,当我们打某个字符或快捷键时展现给我们(织出),然后,当我们选择了一个方法或字段时,自动输出一些代码输出到源码文件中(织入)。
这算不算AOP呢?这个例子比例子2重一点。
例子3:C#的扩展方法 + IDE 的智能提示
·我们对某一或某些类型的行为进行扩展,或者是调用,或者是工具类或工具方法。通过这些扩展,我们可以节省代码量,可以共用以前的代码
·在没有扩展方法之前,上述调用分散在系统的各处。你想知道这些关注点,必须去查找系统中引用的各个类。假定有6个类ClassUtil1, BBBB, HSBDKC, CA, JDF, CSLD 都针对类型T提供了工具方法,想调用这些工具方法,必须采用某种途径得到这6个类的类名,才能去调用这些方法,而这些类的类名分散在系统的各处,想得出,需要花费不菲的代价。
·通过扩展方法和IDE的智能提示,当我们打了这个类型实例的名称之后,打一个“.”,那么那些分散在系统各处的扩展方法就被IDE“织出”了放在我们的面前任我们选用,我们应用了扩展方法之后,编译器在编译时将自动将那些工具方法“织入”进程序。
这个例子的重量级又较例子2更胜一筹。这到底算不算AOP呢?
来一段维特根斯坦式的话:一棵树称得上树林吗?十棵树在一起,称得上树林吗?一百颗树在一起,称得上树林吗?一千棵树。。。一万棵树在一起呢?
《建筑的永恒之道》书中提出质、门、道三个概念:无形之质、有形之门、永恒之道。我对这三个概念以及概念之间的关系进行了篡改(亚历山大原书中是道通过门实现质,而我总觉得道比质更具备目的性,就把道和质换了下位置,并且发现,这样说的更通顺一些。亚历山大的粉丝别扁我!):
无形之质通过有形之门来实现永恒之道。
(按亚历山大的表述应该是:永恒之道通过有形之门实现无形之质)
看如上三个例子。
AOP的三点内涵这是无形之质,而具体对这个无形之质的实现算有形之门,如:例子1中的const或static;例子2中的IDE的智能感知;例子3中的扩展方法+智能感知;以及AOP的经典实现ASPECTJ。这些实现属于有形之门。通过它们我们可以达到永恒之道:解决问题。
如果将AOP仅仅局限于已有的有形之门,那么我们进了这个门,就可能错过其它的门。
========================= 小插曲 ===================
看三个例子,轻松一下。
例子4:
雨伞——用时打开,不用时关上,省地方。
例子5:
书本——读时打开,不读时关上。
例子6:
VS中的Region
例子4-6应用的是“折叠”模式。
========================= 插曲结束 ===================
例子7:搜索引擎
·我们对想要在网上查找信息
·这些信息分散在网上的各个地方
·通过搜索引擎技术这些信息索引起来(织出),当我们输入关键词时,返回相关信息。
有兴趣的人也可以去琢磨单元测试,琢磨丰田生产系统中的质量控制方法,它们的内核——“无形之质”与上面的例1-3,例7是类似的。
好了,上面的例子全是事后诸葛,只有学习借鉴之用,并无多大的建设意义。
来个现实点的例子。
最近天涯社区涌现出一系列声讨拐卖儿童的帖子,典型如:
http://www.tianya.cn/publicforum/content/free/1/1517383.shtml
看到这个帖子,您想到那些建设性的方面呢?
我当时是想到了AOP。
下面就用AOP的“无形之门”分析一下:
·丢失孩子的家长寻找孩子的愿望——这是关注点,这是方面
·丢失的孩子分散在全国各地——这是现实
·通过某些技术或方法将这些关注点“织出”呢?
关键就是这个“织出”。
通过这些帖子可以看出,现在几乎人人都有手机,大多数手机都能拍照,而大部分人都有较强的道德意识在不付出较大代价的前提下去拯救这些孩子。用手机拍照、然后放到一个网站上集中起来是个很简单的“织出”。
丢失孩子的家长可以浏览这些图片来判断是否是自己丢失的孩子。
然而,当照片很多时,这种浏览是不具效率的,需要提供更有效的“织出”关注点的方法。这就需要用到图像搜索和人脸识别技术。
家长也可以上传自己孩子的照片,然后志愿者看见可疑人可以拍照下来,同家长上传的照片进行比对。
这样的系统如果建立且成功运转起来,就是一个有形之门。
通过有形之门来达到永恒之道——解决问题。
最好,来一首和本文无关的歌曲《忽悠一万年》