Chinaunix首页 | 论坛 | 博客
  • 博客访问: 784538
  • 博文数量: 161
  • 博客积分: 10005
  • 博客等级: 中将
  • 技术积分: 1445
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-04 15:08
文章分类

全部博文(161)

文章存档

2014年(1)

2013年(1)

2011年(2)

2010年(18)

2009年(26)

2008年(18)

2007年(66)

2006年(29)

我的朋友

分类: 项目管理

2007-09-03 13:37:11

为了有助于领会软件架构的概念,我们引入一个名为“PM Tool”的案例。PM Tool是一个项目管理系统,提供项目计划、任务管理和资源管理等功能。本节希望结合案例来讨论软件架构,为读者理解软件架构的概念带来实感。

1.5.1  案例故事

PM Tool有一项名为“查看甘特图”的需求,用户要求“能够以甘特图方式查看任务的起始时间、结束时间、任务承担者等信息”。经过分析我们不难发现,PM Tool至少应提供两种查看任务计划的方式:一种是以表格的方式将任务名称、开始时间等信息列出,另一种是采用甘特图。如图1-6所示。

图1-6  PM Tool至少要提供两种查看任务计划的方式

任务是如何计划的?又具体分配给哪些项目成员?这些信息和PM Tool采用何种方式来展现应当是没有关系的。根据此分析,我们立即想到采用MVC架构,将业务逻辑和展现逻辑分开,如图1-7所示。

图1-7  和具体技术无关的架构方案

上面的架构设计,还处于“和具体技术无关”的层面。我们必须考虑更多的实际开发中要涉及到的技术问题,从而不断细化架构方案,这样才能为开发人员提供更多的指导和限制,也才能真正降低后续开发中的重大技术风险。

对于PM Tool要显示甘特图而言,“甘特图绘制包”是自行开发的,还是采用的第三方SDK,就是一个很重要的技术问题。考虑如下:

一方面,用户根本不关心“甘特图绘制包”的问题,他们只在乎自己的需求是否得到了满足;而项目工期是很紧的,自行开发“甘特图绘制包”势必增加其他工作的压力,为什么不采用第三方SDK呢?

另一方面,短期内决定采用的第三方“甘特图绘制包”可能并不是最优的,所以并不希望PM Tool“绑死”在特定“甘特图绘制包”上。

基于以上分析,架构师会决定:采用第三方SDK,但会自主定义“甘特图绘制接口”将SDK隔离。如图1-8所示。

图1-8  和技术相关的架构方案

有的读者应该已经看出来了,上述设计中采用了Adapter设计模式。

适配器(Adapter)模式

关键字:已存在/不可预见  复用

支持变化:由于Adapter提供了一层“间接”,使得我们可以复用一个接口不符合我们需求的已存在的类,也可以使一个类(Adaptee)在发生不可预见的变化时,仅仅影响Adapter而不影响Adapter的客户类。

结构:

1.5.2  软件架构概念的体现

有关PM Tool的案例故事先讲到这儿,虽然其中仅涉及到架构设计方案的一小部分,但仍然可以体现软件架构的概念——对组成派和决策派的架构概念都有体现。

先说组成派的架构概念,它强调软件架构包含了“计算组件及组件之间的交互”。组件体现在哪里呢?

在图1-7所展示的设计中,“业务层”和“展现层”就是两个组件;当然,这两个组件粒度很粗,并且完全是黑盒。

到了图1-8所展示的设计中,黑盒虽然没有完全变成白盒,但支持MVC协作机制的一部分关键类已经明确——PrgMgtModel、GanttChart和GanttChartImpl都是粒度较细的组件,可以说,“业务层”和“展现层”两个组件在某种程度上已从黑盒变成了灰盒,从而能提供更具体的开发指导。

那么,软件架构概念中所说的“交互”体现在哪里呢?

对于图1-7所展示的设计,“业务层”和“展现层”两个粗粒度组件之间的交互为:展现层从业务层“读取数据”。

“读取数据”这一交互到了图1-8的设计依然存在,但此职责已经“具体落实”成了“GanttChartImpl从PrgMgtModel读取数据”。另外,图1-8的设计中,两个“调用”关系也是软件架构的概念中“交互”的具体例子。

由此看来,组成派软件架构概念完全是对架构设计方案的忠实概括,只不过有一点儿抽象罢了。

再看看决策派的架构概念,它归纳了架构决策的类型,指出架构决策不仅包括关于软件系统的组织、元素、子系统、架构风格等的几类决策,还包括关于众多非功能需求的决策。图1-7所展示的设计那么简单,也包含了设计决策吗?是的,业务层和展现层分离,体现了架构概念中的“软件系统的组织”决策,这一设计决策早已得到了业界的普遍认同。

下面再举个例子,来说明软件架构中的设计决策是如何支持“使用、功能性、性能、弹性、重用、可理解性、经济和技术的限制及权衡,以及美学等”非功能需求的。仅以“弹性”为例吧。为了防止PM Tool“绑死”在特定甘特图绘制包上,架构设计之时作了如下决策(参见图1-8):引入自主定义的GanttChart接口,让实现该接口的GanttChartImpl转而调用第三方SDK(其实就是Adapter设计模式)。这样一来,架构就有了弹性——当发现功能更强大的甘特图程序包时(或决定直接调用Java 2D自行开发甘特图绘制部分时),可以方便地仅更改GanttChartImpl,而其他组件不用更改(如图1-9所示)。

图1-9  软件架构如何具有弹性

1.5.3  重要结论

通过上述分析,我们高兴地看到:组成派和决策派软件架构概念并不矛盾,它们只不过是所站的角度不同罢了;在具体的软件架构实践中,总是同时体现着这两“派”的架构概念。

阅读(1020) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~