第八章 面向对象设计
设计的概念
设计活动
面向对象设计过程的主要活动
设计原则
1.模块化
对于复杂系统而言,降低复杂性的有效方法是将系统模块化,也就是将一个复杂的大系统分解成若干个相对简单的较小部分,称为子系统。如果一个子系统依然是复杂的,那么继续分解直到易于开发和管理为止。子系统的层数不要超过5±2,同一层次内的子系统数目不要超过7±2个。
系统分解的另一种形式是将系统分解为对等的子系统,每一个子系统负责一个不同类型的服务,子系统之间相互独立。
2.耦合度和内聚性
耦合度是表示两个子系统之间的关联程度。当一个子系统发生变化时对另一个子系统的影响很小,,则称它们是松散耦合的;反之,如果变化的影响很大时,则称它们是紧密耦合的。耦合越低越好。
内聚性是子系统内部的相关程度。当子系统中彼此相关的多个对象执行类似的任务时,则认为该子系统是高内聚的,反之,当子系统内的多个对象彼此不相关时,则认为是低内聚的。内聚越高越好。
3.复用性
对于建立软件系统而言,所谓复用就是利用某些已开发的、对建立新系统有用的软件元素来生成新的软件系统。
将具有一定集成度并可以重复使用的软件组成单位称为软构件,软件复用是直接使用已有的软构件通过可组装或合理地修改生成新的系统。
软件体系结构
通常,软件体系结构涉及软件系统的总体组织、全局控制、数据存取以及子系统之间的通信协议等。
典型的软件体系结构:仓库体系结构、分层体系结构、MVC体系结构、客户机/服务器体系结构、管道和过滤器体系结构、MiniLibrary系统体系结构。
系统设计
识别设计元素
确定设计元素的基本原则:
(1)如果一个“分析类”比较简单,代表着单一的逻辑抽象,那么可以将其映射为“设计类”。通常,主动参与者对应的边界类,控制类和一般的实体类都可以直接映射成设计类。
(2)如果“分析类”的职责比较复杂,很难由单个“设计类”承担,则应该将其映射成“子系统接口”。通常,被动参与者对应的边界类被映射成子系统接口。
(3)子系统的划分应该符合高聚合、低耦合的原则。
数据存储策略
常用的数据存储管理有3种方式:
(1)数据文件:数据文件是由操作系统提供的存储形式,应用系统将 数据按字节顺序存储,并定义如何以及何时检索数据。
(2)关系数据库:在关系数据库中,数据是以表的形式存储在预先定义好的称为Schema的类型中。
(3)面向对象数据库:与关系数据库不同的是,面向对象数据库将对象和关系做为数据一起存储。它提供了继承和抽象数据类型,但其查询要比关系数据库慢。
部署子系统
UML部署图反映了系统中软件和硬件的物理构架,表示系统运行时的处理结点以及结点中组件的部署。
系统设计评审
与分析阶段一样,系统设计也是在多次迭代和调整之后产生的,但其质量评审不需要用户参与,由开发人员正式评审,确保系统设计的正确性、完整性、一致性和可行性。
详细设计
方法建模
1.方法的命名
方法要使用完整的描述进行命名,使用“methodName()”形式。
2.方法的可见性
保护的(protected):只在类层次的内部被调用而不能由外部调用,使用符号“#”表示;
私有的(private):只在定义它的类中被调用,使用符号“—”表示;
3.BorrowerInfo类的方法建模
属性建模
将所有属性的可见性设置为private;
仅通过set方法更新属性;
仅通过get方法访问属性;
在属性的set方法中,实现简单的有效性验证,而在独立的验证方法中实现复杂的逻辑验证。
状态建模
状态建模是一种动态建模技术,它主要用于确定系统行为。在详细设计时,状态建模一般只发生在依赖状态展示不同行为的类上。在状态建模中,状态通过对象属性的值来表示,转移是方法调用的结果,经常会反映业务规则。
关系建模
全局:某个对象可以在全局范围内直接被其他对象“引用”;
参数:某个对象作为另一个对象的某个操作参数或者返回值;
局部:某个对象在另一个的某个操作中充当临时变量;
域:某个对象作为另一个的数据成员。
应用设计模式
Abstract Factory模式
目的是用于封装具体的平台,从而使应用程序可以在不同的平台上运行。
Adaptor模式
适配器设计模式的目的是封装遗留系统的代码。
Bridge模式
该模式将一个类的接口与具体实现进行分离。
Facade模式
Facade模式用简单的统一接口封装子系统,从而降低类之间的相关性。
用户界面设计
用户界面设计原则
1.用户控制设计原则
2.一致性
3.个性化
4.宽容性
5.反馈
6.审美和可用性
Web 界面设计
Web界面设计要求具有简洁性,避免使用许多复杂的图片和动画等造成用户操作的分心,同时界面布局应当适合清晰地表达信息,并具有与之匹配的导航性。
用户支持
用户界面应该提供清晰的系统提示和反馈信息,并提供某种形式的在线帮助。
设计文档
软件体系结构设计和详细设计的结果应该形成设计文档,开发组织应该采用一种标准的软件设计说明的模板。