![]()
编辑推荐 本书面向软件设计初学者和有一定经验的软件设计师,介绍和探讨软件设计活动中蕴藏的基础理论和原则,突出软件设计关键理论和决策中的质量和审美追求,包括程序设计与正确性、复杂软件设计与模块化、信息隐藏及其背后的可修改性等质量、大规模系统体系结构设计与可靠性等系统质量。 主要特点 总结和探讨了软件设计的基础要素,包括软件设计的根本目标、衡量标准、抽象与分解、物理与逻辑、设计决策等。 基于基础要素分析各种软件设计方法和技术的关键考虑点,包括结构化编程理论、类型、模块化、信息隐藏、软件设计方法学、软件体系结构理论等。 始终贯彻软件设计的基础要素,尤其是质量和审美观念,分析不同规模软件设计活动对方法和技术的要求,包括小规模软件的程序正确性,中大规模系统的可修改性,大规模软件系统的可靠性、性能、安全等。 结合案例解释较为晦涩难懂的设计方法和技术,力求做到深入浅出。 内容推荐 软件设计是软件开发的核心活动,软件设计理论的发展推动着软件工程的发展。本书梳理了基础的软件设计理论,可帮助读者更好地理解各种软件设计技术。全书共分为5章,第1章介绍软件设计基础原则;第2章介绍程序设计,帮助读者深刻认识程序设计工作背后的机理,而不是仅仅停留在掌握一门或几门程序设计语言上;第3章介绍复杂软件设计,重点包括模块化设计、信息隐藏与设计原则;第4章介绍软件设计方法学,指导读者用系统化、规范化的方式开展软件设计活动,解决软件设计问题;第5章介绍大规模软件系统设计,关注可靠性、效率、可移植性、市场特性、人员与分工等各种要素。<br />本书适合作为软件工程相关专业本科生和研究生的教材,也可作为软件领域相关技术人员的参考书。 目录 目录<br /><br />前言<br /><br />第1章 软件设计基础原则 1<br />1.1 什么是软件设计 1<br />1.1.1 设计是一种“规划” 1<br />1.1.2 软件的材料载体与广义的软件设计内涵 2<br />1.1.3 狭义的软件设计内涵 2<br />1.2 为什么要进行软件设计 2<br />1.3 复杂度控制的关键之一: 设计分层 3<br />1.3.1 分层抽象方法 3<br />1.3.2 软件设计的分层 3<br />1.3.3 设计层次验证 4<br />1.3.4 软件设计分层要点 4<br />1.3.5 产品设计与工程设计 5<br />1.4 复杂度控制的关键之二:关注点分离 6<br />1.4.1 分离设计主题 6<br />1.4.2 多视点方法 6<br />1.5 软件设计的目标与衡量标准 7<br />1.5.1 根本标准:功能、质量、审美 8<br />1.5.2 设计目标和衡量标准应用示例 8<br />1.5.3 功能是设计方案的推荐特征 12<br />1.5.4 质量是工程设计的重点 12<br />1.5.5 审美是超越合格达到优秀的路径 14<br />1.5.6 软件设计的结果是一种折中与妥协 16<br />1.6 外部表现与内部结构 17<br />1.6.1 软件设计的重点是坚固、优雅的内部结构 17<br />1.6.2 外部表现和内部结构的区分示例 17<br />1.6.3 抽象、分解与层次结构 21<br />1.6.4 常见的设计对象及其外部表现和内部结构 23<br />1.6.5 设计整个系统时区分外部表现和内部结构 24<br />1.6.6 设计模块时区分外部表现和内部结构 25<br />1.6.7 设计类时区分外部表现和内部结构 29<br />1.6.8 设计数据结构时区分外部表现和内部结构 33<br />1.6.9 设计代码时区分外部表现和内部结构 34<br />1.7 逻辑设计与物理设计 35<br />1.7.1 载体介质及其匹配 35<br />1.7.2 区分逻辑设计与物理设计 35<br />1.7.3 设计数据类型时逻辑设计与物理设计的失配 36<br />1.7.4 设计数据结构时逻辑设计与物理设计的失配 37<br />1.7.5 设计面向对象机制时逻辑设计与物理设计的失配 37<br />1.7.6 设计模块时逻辑设计与物理设计的失配 38<br />1.7.7 设计质量时逻辑设计与物理设计的失配 38<br />1.8 软件设计是持续决策的过程 39<br />1.8.1 设计结果与设计过程 39<br />1.8.2 决策的要素 39<br />1.8.3 设计是一个跳跃性过程,验证设计是一个推理过程 40<br />1.8.4 选择一个可行答案,没有专享正确答案 40<br />1.8.5 设计决策有顺序影响,而且影响不可逆 41<br />1.8.6 设计约束:是友非敌 41<br />1.9 工程与艺术 42<br />1.9.1 工程设计与艺术设计 42<br />1.9.2 理性主义与经验主义 42<br />1.9.3 设计兼具科学性与艺术性 43<br />1.10 总结 43<br /><br />第2章 程序设计 44<br />2.1 如何保证程序正确性 44<br />2.1.1 像设计硬件一样设计软件吗 44<br />2.1.2 测试不能保证正确性 45<br />2.1.3 用程序设计方法实现正确性 45<br />2.2 结构化编程与功能正确性 46<br />2.2.1 使用简单结构—三种控制结构 46<br />2.2.2 使用块结构组织复杂代码 48<br />2.2.3 兼顾正确性与复杂度控制:函数/方法 54<br />2.3 数据抽象、类型与数据操作正确性 55<br />2.3.1 类型 55<br />2.3.2 结构化类型:强正确性保证 56<br />2.3.3 非结构化类型:弱正确性保证 57<br />2.3.4 复杂抽象数据类型(数据结构)及其质量 60<br />2.4 程序契约与正确性 62<br />2.4.1 前置条件与后置条件 62<br />2.4.2 不变量 63<br />2.4.3 程序契约的局限性 64<br />2.5 面向对象编程与可复用性 64<br />2.5.1 可复用性需要的出现 64<br />2.5.2 面向对象编程与可复用性 65<br />2.5.3 类和对象 65<br />2.5.4 封装 68<br />2.5.5 继承 71<br />2.5.6 多态 73<br />2.6 软件构造与更多代码质量 73<br />2.6.1 什么是软件构造 73<br />2.6.2 软件构造技术与代码质量 74<br />2.6.3 软件构造技术示例 75<br />2.7 总结 81<br /><br />第3章 复杂软件设计 82<br />3.1 控制更高的复杂度需要模块 82<br />3.1.1 模块 82<br />3.1.2 模块分解质量与模块化、信息隐藏 83<br />3.2 模块化 83<br />3.2.1 模块分割的质量考虑 83<br />3.2.2 理想中的模块分割—完全独立 83<br />3.2.3 现实中的模块分割—低耦合、高内聚 84<br />3.2.4 代码组织及联系方式分析 84<br />3.3 (结构化)函数/方法之间的耦合 86<br />3.3.1 内容耦合 86<br />3.3.2 公共耦合 88<br />3.3.3 控制耦合 90<br />3.3.4 印记耦合 92<br />3.3.5 数据耦合 95<br />3.3.6 隐式的耦合 97<br />3.3.7 函数/方法之间的耦合小结 100<br />3.4 (结构化)函数/方法的内聚 101<br />3.4.1 偶然内聚 102<br />3.4.2 逻辑内聚 102<br />3.4.3 时间内聚 103<br />3.4.4 过程内聚 104<br />3.4.5 通信内聚 106<br />3.4.6 顺序内聚 107<br />3.4.7 功能内聚 108<br />3.4.8 函数/方法的内聚小结 110<br />3.5 (面向对象)类/对象之间的耦合 110<br />3.5.1 类/对象之间的耦合类型 110<br />3.5.2 方法之间的耦合 111<br />3.5.3 成员变量产生的耦合 112<br />3.5.4 隐藏组件耦合 114<br />3.5.5 分散组件耦合 116<br />3.5.6 明确组件耦合 118<br />3.5.7 修改型继承耦合 118<br />3.5.8 改进型继承耦合 121<br />3.5.9 扩展型继承耦合 121<br />3.5.10 继承的降耦合作用 122<br />3.5.11 继承的弱点:灵活性 123<br />3.5.12 类/对象之间的耦合小结 124<br />3.6 (面向对象)类/对象的内聚 126<br />3.7 复杂模块的耦合与内聚 127<br />3.7.1 复杂模块之间的耦合 127<br />3.7.2 复杂模块的内聚 127<br />3.8 按功能设计与按决策设计 130<br />3.8.1 KWIC 130<br />3.8.2 按功能进行设计 130<br />3.8.3 按决策进行设计 131<br />3.8.4 方案比较 132<br />3.8.5 比较结果分析 133<br />3.9 信息隐藏 134<br />3.9.1 基本思路 134<br />3.9.2 隐藏设计决策 134<br />3.9.3 封装变化 136<br />3.10 (结构化)函数/方法的信息隐藏分析 137<br />3.11 (面向对象)类/对象的信息隐藏分析 138<br />3.11.1 耦合、内聚与信息隐藏 138<br />3.11.2 单一职责原则 139<br />3.11.3 接口分离原则 139<br />3.11.4 依赖倒置原则 140<br />3.11.5 开闭原则 142<br />3.12 复杂模块的信息隐藏分析 144<br />3.12.1 重新审视耦合与内聚 144<br />3.12.2 决策的层次结构 146<br />3.12.3 模块的层次结构 147<br />3.12.4 模块说明 147<br />3.13 总结 148<br />3.13.1 模块化方法总结 148<br />3.13.2 信息隐藏方法总结 149<br />3.13.3 设计原则 149<br /><br />第4章 软件设计方法学 150<br />4.1 概述 150<br />4.1.1 什么是软件方法学 150<br />4.1.2 软件方法学流派 150<br />4.1.3 软件设计方法学 151<br />4.1.4 使用软件设计方法学的好处 152<br />4.2 逐步精化程序设计 152<br />4.2.1 基本思想 152<br />4.2.2 示例一 153<br />4.2.3 示例二 153<br />4.2.4 示例三 155<br />4.2.5 作用和效果 158<br />4.3 结构化软件设计 158<br />4.3.1 基本思想 158<br />4.3.2 示例一 159<br />4.3.3 示例二 160<br />4.3.4 作用和效果 163<br />4.4 数据为中心的软件设计 163<br />4.4.1 基本思想 163<br />4.4.2 示例一 164<br />4.4.3 示例二 166<br />4.4.4 作用和效果 168<br />4.5 面向对象软件设计 168<br />4.5.1 基本思想 168<br />4.5.2 示例一 169<br />4.5.3 示例二 170<br />4.5.4 作用和效果 175<br />4.6 总结 176<br /><br />第5章 大规模软件系统设计 178<br />5.1 大规模软件系统设计的关注点 179<br />5.1.1 质量 179<br />5.1.2 项目环境与约束 179<br />5.2 高层次软件设计—软件体系结构 181<br />5.2.1 详细设计的不足 181<br />5.2.2 高层次软件设计的出现 182<br />5.2.3 高层设计与中层设计 183<br />5.2.4 高层结构的关键:连接件 184<br />5.3 软件体系结构设计元素 185<br />5.3.1 部件 185<br />5.3.2 连接件 186<br />5.3.3 配置 187<br />5.3.4 高层抽象的作用 188<br />5.4 软件体系结构设计的“4+1”视图 189<br />5.4.1 “4+1”视图概述 189<br />5.4.2 场景视图 190<br />5.4.3 逻辑视图 190<br />5.4.4 开发视图 191<br />5.4.5 进程视图 192<br />5.4.6 物理视图 192<br />5.5 软件体系结构设计与质量 193<br />5.5.1 可靠性与体系结构设计 193<br />5.5.2 可用性与体系结构设计 196<br />5.5.3 安全性与体系结构设计 198<br />5.5.4 性能与体系结构设计 200<br />5.5.5 可修改性与体系结构设计 202<br />5.5.6 可测试性与体系结构设计 203<br />5.6 总结 204<br /><br />附录 205 |