软件设计概述
一、软件设计基本原则
1 . 模块
是指执行某一特定任务的数据结构和程序代码。
- 将模块的接口和功能定义为其外部特性
- 将模块的局部数据和实现该模块的程序代码称为内部特性。
在模块设计时,最重要的原则就是实现信息隐蔽和模块独立。
2 . 信息隐蔽
将每个程序的成分隐蔽或封装在一个单一的设计模块中,并且尽可能少地暴露其内部的处理过程。
信息隐蔽可以提高软件的可修改性、可测试性和可移植性。
3 . 模块独立
模块独立是指每个模块完成一个相对独立的特定子功能,并且与其他模块之间的联系最简单。
通常用(模块之间联系的紧密程度)和(模块内部各元素之间联系的紧密程度)两个标准来衡量,我们的目标是“、”。
4 . 内聚
指模块内部各元素之间联系的紧密程度。模块的内聚类型分为7种,根据内聚度从高到低的排序。
- (1)非直接耦合:两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。这种模块的耦合度最低、模块独立性最强。
- (2)数据耦合:指两个模块之间有调用关系,传递的是简单的数据值,相当于高级语言的值传递。
- (3)标记耦合: 指两个模块之间传递的是数据结构,如高级语言中的数组名、记录名、文件名等这些名字即标记,其实传递的是这个数据结构的地址。
- (4)控制耦合:指一个模块调用另一个模块时,传递的是控制变量(如开关、标志等),被调模块通过该控制变量的值有选择地执行模块内某一功能。
- (5)外部耦合:一组模块都访问同一全局简单变量而不是同一全 局数据结构,而且不是通过参数表传递该全局变量的信息。
- (6)公共耦合:指一组模块都访问同一个公共数据环境,如全局数据结构,共享通信区。
- (7)内容耦合 : 一个模块直接使用另一个模块的内部数据,或通过非正常入口而转入另一个模块内部。是最差的耦合。
6 .深度
表示软件结构中控制的层数,它往往能粗略地标志一个系统的大小和复杂程度。如果层数过多则应该考虑是否有许多管理模块过分简单,能否适当合并。
7 .宽度
是软件结构内同一个层次上的模块总数的最大值。宽度越大系统越复杂。对宽度影响最大的因素是模块的扇出。
8 .扇出
模块的扇出是指一个模块直接控制(调用)的下层模块数目。扇出过大意味着模块过分复杂,需要控制和协调过多的下级模块;扇出过小也不好。设计得好的系统平均扇出是3或4。
9 .扇入
是指有多少个上级模块调用它,扇入越大则共享该模块的上级模块数目越多。
在模块分解时需要注意:
- 保持模块的大小适中
- 尽可能减少调用的深度
- 直接调用该模块的次数应该尽最多,但调用其他模块的次数则不宜过多(扇入大,扇出小)。好的软件设计结构顶层高扇出 ,中间扇出较少,底层高扇入。
- 保证模块是单入口、单出口的
- 模块的作用域应该在模块之内
- 功能应该是可预测的
二、结构化设计方法
一、软件设计
从工程管理的角度,将软件设计分为:
- 概要设计阶段
- 详细设计阶段
从技术的角度,将软件设计分为:
- 体系结构设计
- 数据设计
- 接口设计
- 过程设计
二、模块的分类
1.传入模块:从下属模块取数据,进行某些处理,再将其传送给上级模块。
2.传出模块:从上级模块取得数据,进行某些处理,传送给下属模块。
3.变换模块:从上级模块取来数据,进行特定处理后,送回原上级模块。
4.协调模块:对其下属模块进行控制和管理的模块。
例1:采用McCabe度量法计算下列程序图的环路复杂性为 ( )。
A. 2 B. 3 C. 4 D. 5
多态(polymorphism)
- 指同一个操作作用于不同的对象时可以有不同的解释, 并产生不同的执行结果。
多态分两种:
- 通用多态
- 特定多态
通用多态又分为参数多态和包含多态
- 参数多态:采用参数化模板,通过给出不同的类型参数, 使得一个结构有多种类型。
- 包含多态:同样的操作可用于一个类型及其子类型。(注 意是子类型,不是子类。)包含多态一般需要进行运行时 的类型检查。
特定多态分为强制多态和过载多态。
- 强制多态:编译程序通过语义操作,把操作对象的类型强行加以变换,以符合函数或操作符的要求。
- 过载多态:同一个名(操作符﹑函数名)在不同的上下文中有不同的类型。
例1:在面向对象技术中,不同的对象在收到同一消息时可以 产生完全不同的结果,这一现象称为(),它由()机制来 支持。利用类的层次关系,把具有通用功能的消息存放在高层次,而不同的‘实现这一功能的行为放在较低层次,在这 些低层次上生成的对象能够给通用消息以不同的响应。
A. 绑定 B. 继承 C. 消息 D. 多态
A. 绑定 B. 继承 C. 消息 D. 多态例2:在多态的几种不同形式中,( 37) 多态是一种特定的 多态,指同一个名字在不同上下文中可代表不同的含义。
A.参数 B.包含 C.过载 D.强制
- 消息(Message)
- 是指向对象发出的服务请求
- 对象直接用消息的方式传递信息,而不是参数
- 包括:接收对象名、调用的操作名和适当的参数(如有必要)
- 对象间的消息传递是OO方法的基本原则
- 消息包括
- 同步消息,请求者需要等待响应者返回
- 异步消息,请求者不需要等待响应者返回,发出消息后可以继续自己的后续工作(和函数调用有本质区别)
二、面向对象设计
面向对象设计的基本准则是:
复制代码
面向对象设计(含设计模式)的原则:
(1)单一职责原则。
(2)开放–封闭原则。
(3)李氏(Liskov)替换原则。
(4)依赖倒置原则。
(5)接口隔离原则。
(6)组合重用原则。
(7)迪米特(Demeter)原则。四、用户界面设计
用户界面设计的原则:
- (1)置于用户控制之下
- (2)减少用户的记忆负担
- (3)保持界面的一致性
五、设计模式
一、设计模式(Design pattern)
是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
- 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性;
- 设计模式使代码编制真正工程化;
- 设计模式是软件工程的基石脉络,如同大厦的结构一样。
二、设计模式分为三大类
- 创建型模式主要用于创建对象。共五种:工厂方法模式、抽象 工厂模式、单例模式、建造者模式、原型模式。
- 结构型模式主要用于处理类或对象的组合。共七种:适配器 模式、装饰器模式、代理模式、外观模式、桥接模式、组合模 式、享元模式。
- 行为型模式主要用于描述类或对象怎样交互和怎样分配职责。 共十一种:策略模式、模板方法模式、观察者模式、迭代子模 式、责任链模式、命令模式、备忘录模式、状态模式、访问者 模式、中介者模式、解释器模式。
1.工厂方法模式(Factory Method)
也叫虚拟构造器模式,它定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实例化延迟到其子类。 在工厂方法模式中,工厂父类负责定义创建产品对象的公共 接口,而工厂子类则负责生成具体的产品对象,这样做的目 的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
工厂方法模式结构
6.适配器模式(Adapter Class/Object)
将一个类的接口转换成客户希望的另外一个接口。使得原本不相容的接口可以协同工作。
适用性:
- 想使用一个已经存在的类,而它的接口不符合你的需求。
7.桥接模式(Bridge)
将抽象部分与它的实现部分分离,使它们都可以独立地变化。 如果要绘制矩形、圆形、椭圆、正方形,至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、 蓝色等。
9.装饰模式(Decorator)
动态地给一个对象添加一些额外的职责。提供了用子类扩展功能的一个灵活的替代,但比生成子类更为灵活。
装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。10.外观模式(Facade)
定义了一个高层接口,为子系统中的一组接口提供一个一致的界面,从而简化子系统的使用。
14.模板方法(Template Method)
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
例:银行业务办理流程在银行办理业务时,一般包含几个基本步骤,首先取 排队,然后办理具体业务,最后对银行工作人员进行评分。无论具体业务是取款、存款还是转账,基本流程都一样。
18.中介者模式(Mediator)
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
20.观察者模式(Observer)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
![]()
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!