一步一步做项目(19)架构设计


在前面 一步一步做项目(13)managePublicNotice用例的分析模型的基础上进行,重要用例的分析结束后,就可以进行系统的架构设计了,当然,对应小系统,没有什么太多的设计,主要受技术限制,选用了相应的技术,其架构基本就确定了,我这里就是针对采用ssh框架技术的系统来进行相应的架构处理。

概述

开发构架需要大量的时间,但是,经验表明,有一个好的构架作指导,后面的各阶段会大大缩短整个开发周期,对大型项目尤其重要。在第一个生命周期的细化阶段,大约投资了30%的初期产品发布时,就可能开发出一个稳定的构架,这是很吸引人的地方。这个构架会成为系统剩余生命周期的基础。由于对基础的每个改动代价都很昂贵,在某些情况下也非常麻烦,因此,在开发工作的初期阶段得到一个稳定的构架是至关重要的。一方面,为某一特定系统开发构架是创建新的东西;另一方面,构架技术已经使用很多年了,已经积累了开发好的构架的经验和知识,有许多经过多年进化而得到的通用“方案”,包括结构、协作和实际的构架,每个有经验的构架设计师都应熟悉这些方案,这些方案通常称为“模式”,如构架模式和设计模式,通用模式是构架设计师所依赖的资源。

架构设计的步骤

建立坚实、可靠的构架需要经历如下几个步骤
1)确立目标
2)将类分组
3)展示技术
4)抽取子系统
5)应用准则和目标对构架进行评估

架构设计示例

1)确立目标

可扩展性。
虽然所有的系统都会发生变化,但是,普通高校艺术类招考综合管理系统的目标看起来已经相当集中了——从考生那里获取志愿数据,院校提供报考专业,考点安排考试,管理机构负责监控,同样的数据针对不同的用户有不同的展现。因此,对于采用成熟的技术来实现的话,可扩展性不是问题,因而优先级不高。
可维护性。
CMSAECU系统必须易于理解和维护,系统应该可以配置,方便系统修改。
可靠性。
由于系统要处理敏感数据,必须高度可靠。它毕竟不是为支持生命系统而建造的,所以限制范围内的停机时间是可以接受的,但是,不可预测的停机时间是不应该出现的。
可伸缩性。
因为考生数量可能大幅增加,所以系统必须能够扩大以适应更多的数据和更多的用户。

2)将类分组

对于一般的管理信息系统,通过分析,一般有这样一些分析类:

  • 实体类
  • 用户界面类
  • 控制类
  • 系统接口类
  • 定位器类

针对正在开发的系统,将类分组并评估每个类。
model包 ,针对实体类进行分组,便于采用通用技术来处理,包括:Agenda、ApplyForTheCollege、AssignExaminationRoom、College、Discipline、Enrollment、ExaminationApply、ExaminationArrangement、ExaminationPoint、ExaminationRoom、Examinee、PublicNotice、SchoolAdmissionBrochure、StudentContact、TrainingSchool。
dao包 ,针对实体类访问进行分组,提供数据操作处理技术,包括:AgendaDao、ApplyForTheCollegeDao、ssignExaminationRoomDao、CollegeDao、DisciplineDao、EnrollmentDao、ExaminationApplyDao、ExaminationArrangementDao、ExaminationPointDao、ExaminationRoomDao、ExamineeDao、PublicNoticeDao、SchoolAdmissionBrochureDao、StudentContactDao、TrainingSchoolDao。
service包 ,针对业务逻辑进行分组,提供业务逻辑控制,包括:AgendaService、ApplyForTheCollegeService、ssignExaminationRoomService、CollegeService、DisciplineService、EnrollmentService、ExaminationApplyService、ExaminationArrangementService、ExaminationPointService、ExaminationRoomService、ExamineeService、PublicNoticeService、SchoolAdmissionBrochureService、StudentContactService、TrainingSchoolService。
action包 ,针对用户界面进行分组,提供界面处理技术,包括:AgendaAction、ApplyForTheCollegeAction、ssignExaminationRoomAction、CollegeAction、DisciplineAction、EnrollmentAction、ExaminationApplyAction、ExaminationArrangementAction、ExaminationPointAction、ExaminationRoomAction、ExamineeAction、PublicNoticeAction、SchoolAdmissionBrochureAction、StudentContactAction、TrainingSchoolAction。
根据类之间的关系,可以描述包之间的耦合度,类之间的关系,和下图描述的关系类似:
agenda
因此,可得到包之间的依赖关系,如下图所示:
包图

3)展示技术

有了基本的包图,上面的包图,只是单纯地从系统本身的角度来描述系统的构成关系,现在要进行设计,就需要针对具体的技术,因此,将实现的技术叠加上去,我这里的实现技术就是SSH框架技术,就得到包含所采用技术的包之间的依赖关系,如下图所示:
ssh技术包图

4)抽取子系统

系统不是孤立存在的,需要和其他系统进行交互,就需要针对其他系统提供接口,就需要抽取需要的处理,形成子系统,这个系统需要提供Excel数据的导入导出,普遍需要进行Excel表格操作,在导入导出过程中,就必须提供统一的处理机制,以便简化系统,便于修改,这样就得到如下图所示的包图:
包含子系统

5)应用准则和目标对构架进行评估

完成了构架设计,需要针对目标进行评估:

  1. 可维护性和可扩展性
    每个包都有严格定义的职责,而且每个包都被很好地封装。对易于理解并易于维护的系统来说,这无疑是令人满意的。另外,系统是基于一些标准的技术,将来的开发人员能够从系统文档之外得到大量的资源支持。
  2. 可靠性和可伸缩性
    对系统来说,决定可靠性和可伸缩性方面的大多数因素都集中在model和service两个包内,而且要使用SSH框架来实现。如果能够选择正确的服务器,为设计分配充足的时间,并在实际的应用服务器上建立原型系统,应该能够解决这方面的问题。

经过一系列的构思、模型、分组处理之后,就完成了系统构架的设计,其基本过程对于小系统主要受采用技术的限制,对于大系统来说,要得到一个成熟的构架那是相当困难的,而且要经过漫长的时间来验证。