作者:fasiondog
来源:http://blog.csdn.net/kongdong/
自年前写了《破冰》(http://blog.csdn.net/KongDong/archive/2006/01/19/584356.aspx)以来,很少人理解我所说的和我所困惑的是什么,只有自己寻找答案,当时主要的问题是:
1、基于“特性”设计的思路不可以完全抛弃,它不利于我们理解系统;
2、组件化需要实现技术上的突破,否则流程的改进没有方向和支撑,只有更多的困扰。而“过滤树”是破解组件化中大量if else的一种可能技术,当然出来性能问题需要实践才能解决。
事有凑巧,就在我还想着“过滤树”究竟如何应用的时候,看到了一本书,里面介绍了“组合过滤器”,深感兴趣,便买回研究了一把,才发现自己所困惑和所想的正是AOP思想的萌芽。这本书介绍的是AOP(Aspect-Oriented Programming)技术,过滤器则是AOP实现的一个重要分支。AOP本身是一种编程技术,它起源于破解代码中缠绕和分散情况的目的,但是它所引入的“维度、分离、合成、系统编织”等观念,对于存粹的系统分层思想是极大的进步,也破除了当前方法和过程在我眼前凝聚的迷雾。AOP的思想已经在角落里偷偷发展了近10年,其基本思想目前正是囤积欲发的时刻,已经形成了不少关于AOSD(面向方面的软件开发方法)。利用AOP中的“维度、分离与合成”的观点,去看待当前系统设计、软件开发、测试、组件、可靠性等等,以及他们的整合,会有柳暗花明的感觉,也是真正理解当前方法和过程中问题的关键。也许,AOP作为一种编程技术,并非是革命性的进步,但它所引入的概念和“分层”思想一样,体现着人们理解、看待系统的基本原理。
下面是近期学习和思考所得,由于时间的关系,寥寥数笔,无法成文尽述,后续有时间再梳理成文,暂先共享之:
1、架构是基础,它承载了所有的需求,其重要性毋庸置疑;
2、系统只有为需求的人创造价值才是有意义的,因此需要从不同利用相关人的“关注点”去理解系统究竟可以做什么;
3、“关注点”有一个重要的特性——分离,这是理解系统的关键,也解释了以前基于特性设计的存在理由;
4、“关注点”的分离,应该贯穿需求、分析、设计与实现的全过程,这是理解系统价值以及如何运作发挥作用的唯一途径;
5、与“分离”相对应的概念是“合成”。分离和合成的概念可以这样理解:建筑师构造了基础的房屋结构,但建筑本身还包含其它许多方面,如电线系统、排给系统、电话线布线等等。现在假设建筑师将基础的结构画在了一张幻灯片上,然后复制这样一张幻灯片给电线布线设计师,电线布线设计师在复制的幻灯片上独立的完成了布线设计。同样,复制基础结构的蓝图给不同领域的设计人员们,最终我们将得到一系列的幻灯片。接着,放映第一张基础结构的幻灯片,然后将第二张叠加上去,接着是第三张,如此下去,知道最后一张幻灯片叠加到最顶端,现在,你看到了什么?
6、在需求、分析、设计阶段很容易做到“分离”与“合成”。目前支持UML2.0的建模工具使用XML来描述和保存模型,即使工具本身无法很好的支持分离和合成,我们也可以轻易的编写扩展工具来实现其支持。
7、开发的实现阶段是分离和合成的关键阶段,也是目前组件化的症结所在。
8、实现阶段的合成技术,如果不能解决,会产生所谓的代码“缠绕(tangle)和分散(scatter)”,意味着新增一个功能,需要涉及修改众多的代码和模块。
9、“合成”意味着能够容易的叠加不同的关注点(包含功能需求和非功能需求),其需要实现阶段的技术支持。虽然在我们当前的系统中,无法达到完美,但依然有很多技术可以借鉴。比如消息驱动,其本身具备一定的分离与合成特性。
10、关注点保持分离解释了“特性”设计存在的合理性,虽然并不一定完美。
11、保持关注点的全程分离也对系统模型的维护有较大的好处。当前基于项目形式的开发方式造成的最大的问题是文档无法检索和维护(因为当前公司基于项目的开发方式既不是模块分离,也不是关注点分离),而分离的思路给予了启迪。以前基于特性设计的最大优点,就是保持关注点的分离,它利于归档和检索,比如《XXX特性设计规格说明书》、《YYY特性说明书》。将每一个特性分离看成不同的部件(Part),那么所谓系统的描述,可以通过配置管理的概念,予以轻易的集成和检索,因为每一个都是独立的配置项,可以轻易的抽离并重新组装系统。另外一种基于系统结构即模块方式的文档开发,是从结构上保持了分离。分离是软件开发中文档编档的重要因素。
12、分离的概念比分解要广阔的多,也许分解可以算是分离的一个特例。
13、模块的分离也同样重要,只有系统文档的可理解性和架构的充分结合(可以理解为结构和关注点的分离)才是一个好的开发方法。
14、分层的概念(含模块化、信息隐藏等)、关注点分离与合成的概念的结合将是系统与软件开发方法中最终要的基础和方向。