设计方法的分类: 1. 结构化设计(自顶向下)——没有提供适当的方法解决并发性问题。 |
面向对象的本质:抽象、封装、多态、继承。第一要着的抽象是不确定的,它具有层次,可以排列成为一种层次。 |
框架——软件复用的发展方式:程序主体反主为客,并让辅助组件反客为主,即控制反转。如果一个程序库负担了整个应用程序来于运行的主干算法,并实现了主动的事件循环、事件处理机制、控制流程。则为框架。 |
所谓的应用架构的外在本质是把“技术问题和业务问题分离”,而其内在本质是抽象,把一个系统抽象为技术和业务。以达到技术的复用。任何一个系统都存在技术问题,虽然他们的业务问题可能不一样。 技术层面上,建立一个应用架构从宏观层面来看第一要著是使系统结构化,结构化的途径有三个:分层,管道和过虑,黑板。
因此开发一个应用系统,分层成为设计的首先。以下将详细讨论分层模式下的抽象机制: |
(图1) |
数据访问逻辑层采用domain model,同时使用object/relational mapping pattern的Data mapper pattern和active record pattern向上提供数据访问服务。而在Data mapper和active record中进行concurrency pattern进行并发性控制。 |
业务逻辑层分成三个部分,如下图: 基础: 1. 业务实体由实体集和实体组成,这些来自数据访问逻辑层。 中级: 1. 考虑一个业务规则,其有严格的限制,联系到多个业务对象,同时其关系成网状,例如:一个实体的方法实现必须满足多个实体的状态值,大量的条件判断不可避免。当系统复杂性提高时,网状的关系将不可避免。此时采用以上简单的方法不能满足要求。这时采用扩展有限状态机来实现将可以解决问题。 高级: 1. 业务规则和业务外观的外在本质上是一个控制系统。业务规则实现状态的转换,而业务外观委派状态的行为。 |
表现层: 基础: 表现层作为系统用户界面层,有两个工作:1.界面转换控制;2.用户交互数据收集及其完整性与有效性验证。 1. 界面的转换控制: 当系统的转换复杂化后,对转换的控制变的难以接受,系统将出现多个控制器,对系统的行为变的不可把握。因此在这一层可以采用扩展有限状态机来作为控制系统,这样可以保证系统的行为在可控制范围内,同时可以实现分布式协调控制。 2. 用户交互数据收集及其完整性与有效性验证: 用户界面另一个重要工作。对其的验证包括:1. 对数据的有效性如格式,系统可接受范围检查;2. 数据收集的完整性,例如:1.一些数据用户必填;2. 当用户选择某个选项后,另一些数据成为必填。 高级: 表现层为一个交互应用系统,要解决的最大问题保持内核独立于用户接口,解决方法有三种:MVC和PAC。
|
然而根据已知,抽象还同时具有不确定性,因而从技术的另一个角度看一个应该架构的抽象还可以如下排列。 技术问题——本质上是一个控制系统的抽象排列:
对应这些抽象技术问题,一个应用架构中必须包含如下服务中心: 1. Core中心。提供核心服务和运行环境。采用组件配置模式和接口模式 2. Name中心。 3. Auth中心。提供验证服务和注册服务。 4. Service中心。提供应用服务。 5. Pesistence中心。提供统一的持久化服务。 7. DataRule中心。提供交互数据收集的完整性和有效性验证。 8. Community中心。提供通讯服务。 9. Concurrency中心。提供同步和并发接口和服务。 10. EP中心 11. BizRule中心。 12. WorkFlow中心 |
No silver bullet |
不要过度设计或者过度工程。不要为不存在的扩展做设计。因为代码一旦存在,通常代码并不会被删除,因为那样很麻烦,容易导致问题,而你期待着它将在某个时候被使用。于是代码随着系统增长变的冗长,变得需要更多的人来维护。不幸的事,当更多得人加入时,分工产生了,于是代码被重复,系统再一次增加。当新人加入,每个人都必须读懂旧的代码,尽管它没有用。 |
软件开发的第一特性是可操作性。在面向结构时代,算法是可操作性的代表,可以通过一个阶段的重复性操作得到问题的解。在面向对象时代,模式则为代表。从这个意义上看,模式和算法是一致的,它们反映了人们对世界可操作性的认识。 |
然而有什么理由认为:所有的东西都具有可操作性的?这样的观点我们证明过吗?当我们将这种理论推广到“世界所有的东西都是对象”的时候,我们对于理性、可操作性的过分信任已经让我们陷入了狂妄和自大。 |
软件开发的可操作性的主体——需求。我们存在的需求电阻。需求不存在或者需求不正确时,我们失去了操作主体。 |