当前位置:文档之家› 软件设计基本原理

软件设计基本原理


耦合
非直接耦合:两个模块之间没有直接联系,只有 控制和调用 数据耦合:一个模块访问另一个模块时通过数据 参数来交换信息 标记耦合:一组模块通过参数表传递记录信息 控制耦合:一个模块通过控制信息控制另一个模 块 外部耦合:一组模块都访问同一全局变量 公共环境耦合:一组模块都访问同一个公共数据 环境(如共享通信区、文件、内存公共缓冲区) 内容耦合:一个模块直接访问另一个模块的内部 数据;一个模块不通过正常入口转入另一模块; 多个模块有部分代码重叠
4. 信息隐蔽与局部化
信息隐蔽(又称信息隐藏):一个模块内 包含的信息(过程或数据) 对于不需要这些 信息的其他模块来说不可见(不能访问) 局部化:将关系密切的软件元素的位置尽 量靠近 信息隐蔽与局部化有利于软件的可维护性, 可以防止误操作和误修改
5. 自顶向下逐步求精
自顶向下 vs 自底向上 自顶向下、逐步求精、各个击破 分解步骤
正文加 工系统
输入
输出
编辑
加标题
存储
检索
编目录
格式化
添加
删除
插入
修改
合并
列表
8. 启发式规则
改进软件结构提高模块独立性 模块规模应该适中:一页(30,<60行) 模块的深度、宽度、扇出和扇入都应适当:扇 出3/4,<5/9;扇入较高 降低模块接口的复杂程度:简单、清晰、含义 明确 设计单入口单出口的模块:避免“病态连接” 模块功能应该可以预测:避免内部存储器(记 忆效应)
第三讲 软件设计基本原理
本讲目的: 了解软件设计的基本原理 作为设计工作指南
1. 软件设计的基本原理
放之四海而皆准的原则
– 抽象 – 自顶向下逐步求精 – 模块化 – 信息隐蔽与局部化 – 模块独立性 – 启发式规则
2. 模块化
模块
可以组合、分解、更换的单元,如过程、函数、 子程序、宏等 完成特定的子功能
10. 面向对象设计方法(OOD) 面向对象设计方法(
运用问题域的思考方式,解放程序员的生产力 软件重用(软件复用)(Reuse) 主要概念:类和对象(属性+方法)、消息机 制、继承、多态性 对象与抽象数据类型( ADT) 主要产品:CORBA、OLE/COM(ActiveX Control)等 主要平台:MS Visual C/C++(MFC)、 C++Builder等
内聚
巧合内聚(偶然内聚):一个模块内各元素之间没有 任何联系或者联系很松散 逻辑内聚:模块内执行几个逻辑上相似的功能,并通 过参数确定该模块完成哪一个功能 时间内聚:把需要同时执行的动作组合在一起 过程内聚:一个模块中各元素密切相关且顺序执行 通信内聚:一个模块内各功能使用了相同的输入数据 或产生相同的输出数据 顺序内聚:模块内各元素与同一功能相关且顺序执行, 通常一个元素的输出是另一个元素的输入 功能内聚:模块内所有元素共同完成一个功能,模块 已不可再分
首先对设计的系统要有一个全面的理解 然后从顶层开始,连续地逐层向下分解 直至系统的所有模块都小到便于掌握为止
6. 模块独立性
模块独立性:模块化、抽象、信息隐蔽和 局部化直接结果 模块独立的好处:
使软件开发更容易、适合分工合作 使软件测试和维护更容易
模块独立的度量
内聚:一个模块内部各元素之间彼此结合的紧密 程度的度量 耦合:不同模块之间互连程度的度量
模块评价标准:
模块可分解性:把问题分解为子问题的系统化机 制 模块可组装性 :把现有的可重用模块组装成新 系统 模块可理解性 :一个模块作为独立单元无需参 考其他模块来理解 模块连续性:系统需求的微小修改只导致对个别 模块,而不是对整个系统的修改 模块保护性 :一个模块内出现异常情况时,它 的影响局限在该模块内部
9. 结构化设计方法(SD) 结构化设计方法(
E.W.Dijkstra:
可以从高级语言中取消goto语句,程序质量与程 序中的goto语句的数量成反比
Bohm & Jacopini:
只用三种基本结构(顺序、选择、循环)就能实 现任何单入口单出口的程序
结构化设计
自顶向下、逐步求精 单入口单出口 三种基本结构
3. 抽象
抽象是一种思维方法:忽略细节,把握本质 软件工程过程的每一步,都是对软件解法的抽象 层次的一次细化 抽象的层次
可行性研究阶段:抽象的最高层,软件被看作一个完整的系 统 需求分析阶段:使用问题环境的术语来描述软件的解法 总体设计阶段:使用计算机环境的术语来描述软件的解法 编程序阶段:抽象的最低层,对计算机底层软硬件依赖性强
高内聚的耦合原则
尽量使用数据耦合,少用控制耦合,限制公共环 境耦合,不用内容耦合 力求高内聚(信息内聚、功能内聚),可用中内 聚(过程内聚、通信内聚),不用低内聚(巧合 内聚、逻辑内聚、时间内聚)
7. 模块层次化
层次结构:树状结构 上层模块调用下层模块 不允许下层模块调用上层模块 避免上层模块越级调用下层模块
模块化
解决一个复杂问题时,自顶向下逐层将软件分解 成若干模块的过程
软件总成本 最小成本区 M 成本或工作量 接口成本
成本/模块
模块数目
– (p1)>C(p2)
E(p1)>E(p2) – C(p1+p2)>C(p1)+C(p2) E(p1+p2)>E(p1)+E(p2) – 结论:分解软件可以减少工作量,但增加接口成本
相关主题