软件工程 Software Engineering 第九章 编码 武汉大学 计算机学院
思考? 编程对软件的开发和维护有何影响?
软件生存期 软件计划 需求分析 软件设计 实现(编码) 测试 维护 定义时期 开发时期 使用和维护时期 退 役
第9章 软件编码 什么是结构化程序设计技术? 程序设计语言的分类如何? 面向对象程序设计语言的优点有哪些? 面向对象程序设计语言的技术特点如何? 如何选择程序设计语言? 如何保持良好的编码风格?
软件开发时期的三个阶段 信息描述 数据设计 功能描述 设计 结构设计 行为描述 实现 程序模块 测试 其他需求 过程设计 集成并确认 的软件
一、结构化程序设计(SP) 无条件转移语句GOTO “好结构” —— “高效率”的争论 缺点 优点 破坏了程序动态结构与静态结构的一致性 难阅读、难理解 易出错、难查错 优点 使程序简单 提高执行效率 “好结构” —— “高效率”的争论
非结构化 结构化 E1 C B T F E2 E3 A D E1 Flag=1 T F E2 E3 Flag=0 C B A D (a)
二、程序设计语言 语言的元计算模型等价 → 功能等价 描述问题的方便性有差异 P A B 语义等价
1. 语言的分类 按语言的演变分类 第一代 机器相关(机器语言,汇编语言) 第二代 高级程序设计语言(Fortran, COBOL, Basic) 第三代 结构化PL 通用语言(Pascal, C, Ada) OOPL(C++, Smalltalk, Java) 专用语言(LISP, Prolog) 第四代 不涉及算法细节的4GL SQL,Program generators, Decision support language Prototyping language, Formal specification language
2. 编程语言对软件的影响 机器求解问题的基本工具 思维方式、解题方式 理想的模块化机制,语法清晰 可读性、可理解性 独立编译机制,编译程序查错能力 可靠性 实现的难易程度,独立编译机制,软件开发工具丰富 开发效率 编译程序优化能力,语言直接操纵硬件能力 运行效率 标准化程度,模块封装机制 可维护性
3. 语言的选择 应用领域 算法和计算复杂性 性能需求 数据结构的复杂性 软件开发人员的知识水平 软件运行环境 等
4. 编码风格(编码原则) 编码风格指一个人编制程序是所表现出来的特点、习惯、逻辑思路等。良好的编码风格可以减少编码的错误,提高程序的可读性,提高开发效率。 代码文档化(标识符的命名、注释安排、程序的视觉组织) 数据说明 语句构造 输入/输出风格 效率 复用
三、面向对象编程(Object-oriented Programming, OOP) 面向对象语言(OOPL) 支持OO概念 编译程序可自动把OO概念映射到目标程序中 非面向对象语言 程序员实现 OOP是否必须用OOPL来实现?
OOD的结果可以用OOPL/非OOPL实现 错误! OOPL功能强于非OOPL? 任何通用语言都可实现OO概念 OOPL实现OO概念远比非OOPL方便! 选择编程语言的关键 一致的表达能力 可重用性 可维护性
1. OOPL的优点 一致的表达方式 可重用性好 可维护性好 OOA→OOD→OOP使用统一的概念 可重用OOA、OOD、OOP的结果 程序显式陈述问题域语义
2. OOPL的技术特点 20世纪50年代,LISP,动态联编、交互式开发 60年代,SIMULA,类,继承 70年代末,Modula_2,Ada,数据抽象机制 80年代,OOPL 纯OOPL(Smalltalk, Eiffel) 混合型OOPL(C++)
OOPL的技术特点主要有: 支持类和对象概念 实现整体-部分结构 实现一般-特殊结构 实现属性和服务 提供类库和强大的开发环境 类型检查 效率
类型检查 按编译时进行类型检查的严格程度,分为 强类型(Strong Typing) 弱类型(Weak Typing) 每个变量(属性)必须准确属于某个类 C++,Eiffel等 弱类型(Weak Typing) 仅要求每个变量(属性)隶属于一个对象 Smalltalk无类型,Foxpro等
强类型语言的优点 可靠 高效 强类型编译型语言 弱类型解释型语言 利于在编译时发现程序错误 增加了程序可读性 可生成高效率目标代码 开发软件产品 快速开发原型
效率问题 许多人认为OOPL的主要缺点是效率低 早期OOPL是解释型而非编译型的 类库 运行时dynamic binding实现多态性,要在运行时查找继承树 优化了查找过程,高效率查找
3. 选择OOPL应考虑的因素 将来能否占主导地位 可重用性 类库、开发环境 其它因素
4. 程序设计风格 提高可重用性 提高可扩充性 提高健壮性 提高方法的内聚 减小方法的规模 保持方法的一致性 把策略与实现分开 全面覆盖 尽量不使用全局信息 利用继承机制 提高可扩充性 封装实现策略 不要用一个方法遍历多条关联链 避免使用多分支语句 精心确定公有方法 提高健壮性 预防用户的操作错误 检查参数合法性等
小 结 结构化程序设计 程序设计语言 编码风格 面向对象语言的优点 面向对象语言的技术特点 选择面向对象语言的实际因素
思考题 根据你的经验,总结编程应遵循的风格,并说明为什么如此能增加代码的可读性和可理解性? 有人认为:“应该尽量用面向对象语言来实现面向对象分析和设计的结果”。你认为他的观点对吗 ?请说明理由。 选择面向对象程序设计语言时应该主要考虑哪些因素?