1.2 AOP产生的前奏——把系统看做一批关注点
从结构化编程SP、面向数据结构编程DOP、面向问题分析PAM到面向对象编程OOP,再到面向界面开发、组件化编程CP、面向方面编程AOP、面向服务架构SOA的发展历史我们可以知道,编程方法学的演进是一步一步地扩大了编程考虑的“边界”。让我们再回头分析AOP编程方法产生的前奏。
1.2.1 拆分关注点
到目前为止,我们编程世界里的宇宙边界是“类”、“接口”,或者“组件”。在这个边界里,我们认为,一个类实现了一个接口,那就不能动态地实现另一个接口,已有类的行为在编译以前就基本固定了,要么是类内部定义的方法,要么是继承和实现接口继承过来的方法。但是在实际的编程工作中我们碰到了“跨边界的情况”,需要多个类、接口、组件合作才能完成工作,比如:多线程并发访问、程序流集中控制、序列化和程序状态保持,以及需要多个类、接口、组件边界共同参于才能完成的工作。为了更好地使多个边界共同完成同一方面的工作,需要将系统进行拆分。
我们可以把一个复杂的系统看做是由多个关注点来组合实现的,一个典型的系统可能会包括几个方面的关注点,如业务逻辑、性能、数据存储、日志和调试信息、授权、安全、线程、错误检查等,还有开发过程中的关注点,如易懂、易维护、易追查、易扩展等,图1-3演示了由不同模块实现的一批关注点组成的一个系统。
图1-3 把模块作为一批关注点来实现
对于系统中的各个模块,都要求实现记录日志、权限检查、事务处理的功能,那么记录日志、权限检查和事务处理就可以作为系统的关注点被拆分出来。
这样,原始系统的实现需求就由3个关注点和基本功能等需求组成。如果把需求比做一束穿过三棱镜的光,我们让需求之光通过关注点鉴别三棱镜,就会区别出每个关注点。如图1-4所示为分离关注点的示意图。
图1-4 关注点分离示意图
1.2.2 拆分需求
关注点也就是需求,它们构成了系统的不同方面的应用要求。开发人员建立一个系统需要满足多个需求,可以把这些需求分为以下两类。
● 核心模块级需求:针对当前系统的用户功能需求;
● 系统级需求:很多系统级需求一般来说是相互独立的,但它们一般都会横切许多核心模块。
举个例子来说,一个典型的企业应用包含许多横切关注点,如验证、日志、资源池、系统管理、性能及存储管理等,每一个关注点都牵涉到几个子系统,如存储管理关注点会影响到所有的有状态业务对象。