敏捷软件开发:原则、模式与实践(C#版)

分类: 图书,计算机/网络,软件工程/开发项目管理,
作者: (美)马丁,(美)马丁著,邓辉,孙鸣译
出 版 社: 人民邮电出版社
出版时间: 2008-1-1字数: 1000000版次: 1页数: 538印刷时间: 2008/01/01开本: 16开印次: 1纸张: 胶版纸I S B N : 9787115165756包装: 平装编辑推荐
软件开发的不朽经典;生动阐述面向对象原则、敏捷实践、UML和模式;大量C#实战示例,让你亲历现场。
“我最喜爱的技术作家Robert Martin善于通过实践展示技术,让读者能够以自己喜欢的方式逐步理解……请把Bob大叔当作你在敏捷世界里的导师。”
——Chris Sells,.NET资深技术专家。微软“软件传奇人物”
“本书是对敏捷编程和敏捷原则最全面和最有价值的介绍……绝对是所有.NET程序员必读之作。”
——Jesse Liberty,微软资深技术专家,Programming C#作者
要想成为一名优秀的软件开发人员,需要熟练应用编程语言和开发工具,更重要的是能够领悟优美代码背后的原则和前人总结的经验——这正是本书的主题。本书凝聚了世界级软件开发大师Robert C.Martin数十年软件开发和培训经验。Java版曾荣获计算机图书最高荣誉——Jolt大奖。是广受推崇的经典著作,自出版以来一直畅销不衰。
不要被书名误导了。本书不是那种以开发过程为主题的敏捷软件开发类图书。在书中,作者延续了自己一贯的写作风格。让你亲历现场,并用幽默亲切的语言和插图.通过一步步展示来自开发一线的代码,分析各种设计决策及其得失,以清晰、易于理解的方式讲述了真实程序设计中最基本然而也是最难做到正确应用的原则(包括SRP、LSP、OCP、DIP、ISP等类设计原则,以及多个包设计原则)与设计模式(不限于GoF经典模式。包括许多作者自己的成果)。
本书不仅是一部深入浅出、生动易懂的面向对象原则与设计模式著作。而且还是一部通俗的敏捷方法导引书和快速实用的LJML教程。通过本书你会发现,许多以前看起来非常枯燥费解的概念,忽然间都豁然开朗。变得鲜活生动起来。
C#版与此前的Java版相比,主要的更新包括加强了UML的介绍章节。使其更加贴近实战;增加了对MVP模式的介绍等。
内容简介
本书中,享誉全球的软件开发专家和软件工程大师Robert C. Martin深入而生动地使用真实案例讲解了面向对象基本原则、重要的设计模式、UML和敏捷实践等程序员必备的知识。
本书于2003年荣获第13届Jolt大奖,是C++和Java程序员提高自身水平的绝佳教材,也适于用作高校计算机、软件工程专业相关课程的教材或参考书。
作者简介
Robert C.Martin(“Bob大叔”)世界级的软件开发大师,著名软件咨询公司Object Mento,公司的创始人和总裁。曾经担任C++Report杂志主编多年,也是设计模式和敏捷开发运动的主要倡导者之一。
目录
第一部分敏捷开发
第1章敏捷实践
1.1敏捷联盟
1.1.1人和交互重于过程和工具
1.1.2可以工作的软件重于面面俱到的文档
1.1.3客户合作重于合同谈判
1.1.4随时应对变化重于遵循计划
1.2原则
1.3结论
1.4参考文献
第2章极限编程概述
2.1极限编程实践
2.1.1完整团队
2.1.2用户故事
2.1.3短交付周期
2.1.4验收测试
2.1.5结对编程
2.1.6测试驱动开发
2.1.7集体所有权
2.1.8持续集成
2.1.9可持续的开发速度
2.1.10开放的工作空间
2.1.11计划游戏
2.1.12简单设计
2.1.13重构
2.1.14隐喻
2.2结论
2.3参考文献
第3章计划
3.1初始探索
3.2发布计划
3.3迭代计划
3.4定义“完成”
3.5任务计划
3.6迭代
3.7跟踪
3.8结论
3.9参考文献
第4章测试
4.1测试驱动开发
4.1.1测试优先设计的例子
4.1.2测试促使模块之间隔离
4.1.3意外获得的解耦合
4.2验收测试
4.3意外获得的构架
4.4结论
4.5参考文献
第5章重构
5.1素数产生程序:一个简单的重构示例
5.1.1单元测试
5.1.2重构
5.1.3最后审视
5.2结论
5.3参考文献
第6章一次编程实践
6.1保龄球比赛
6.2结论
第二部分敏捷设计
第7章什么是敏捷设计
7.1设计臭味
7.1.1设计臭味——腐化软件的气味
7.1.2僵化性
7.1.3脆弱性
7.1.4顽固性
7.1.5粘滞性
7.1.6不必要的复杂性
7.1.7不必要的重复
7.1.8晦涩性
7.2软件为何会腐化
7.3Copy程序
7.3.1熟悉的场景
7.3.2Copy程序的敏捷设计
7.4结论
7.5参考文献
第8章SRP:单一职责原则
8.1定义职责
8.2分离耦合的职责
8.3持久化
8.4结论
8.5参考文献
第9章OCP:开放-封闭原则
9.1OCP概述
9.2Shape应用程序
9.2.1违反OCP
9.2.2遵循OCP
9.2.3预测变化和“贴切的”结构
9.2.4放置吊钩
9.2.5使用抽象获得显式封闭
9.2.6使用“数据驱动”的方法获取封闭性
9.3结论
9.4参考文献
第10章LSP:Liskov替换原则
10.1违反LSP的情形
10.1.1简单例子
10.1.2更微妙的违反情形
10.1.3实际的例子
10.2用提取公共部分的方法代替继承
10.3启发式规则和习惯用法
10.4结论
10.5参考文献
第11章DIP:依赖倒置原则
11.1层次化
11.1.1倒置的接口所有权
11.1.2依赖于抽象
11.2简单的DIP示例
11.3熔炉示例
11.4结论
11.5参考文献
第12章ISP:接口隔离原则
12.1接口污染
12.2分离客户就是分离接口
12.3类接口与对象接口
12.3.1使用委托分离接口
12.3.2使用多重继承分离接口
12.4ATM用户界面的例子
12.5结论
12.6参考文献
第13章C#程序员UML概观
13.1类图
13.2对象图
13.3顺序图
13.4协作图
13.5状态图
13.6结论
13.7参考文献
第14章使用UML
14.1为什么建模
14.1.1为什么构建软件模型
14.1.2编码前应该构建面面俱到的设计吗
14.2有效使用UML
14.2.1与他人交流
14.2.2脉络图
14.2.3项目结束文档
14.2.4要保留的和要丢弃的
14.3迭代式改进
14.3.1行为优先
14.3.2检查结构
14.3.3想象代码
14.3.4图的演化
14.4何时以及如何绘制图示
14.4.1何时要画图,何时不要画图
14.4.2CASE 工具
14.4.3那么,文档呢
14.5结论
第15章状态图
15.1基础知识
15.1.1特定事件
15.1.2超状态
15.1.3初始伪状态和结束伪状态
15.2使用FSM图示
15.3结论
第16章对象图
16.1即时快照
16.2主动对象
16.3结论
第17章用例
17.1编写用例
17.1.1备选流程
17.1.2其他东西呢
17.2用例图
17.3结论
17.4参考文献
第18章顺序图
18.1基础知识
18.1.1对象、生命线、消息及其他
18.1.2创建和析构
18.1.3简单循环
18.1.4时机和场合
18.2高级概念
18.2.1循环和条件
18.2.2耗费时间的消息
18.2.3异步消息
18.2.4多线程
18.2.5主动对象
18.2.6向接口发送消息
18.3结论
第19章类图
19.1基础知识
19.1.1类
19.1.2关联
19.1.3继承
19.2类图示例
19.3细节
19.3.1类衍型
19.3.2抽象类
19.3.3属性
19.3.4聚集
19.3.5组合
19.3.6多重性
19.3.7关联衍型
19.3.8内嵌类
19.3.9关联类
19.3.10关联修饰符
19.4结论
19.5参考文献
第20章咖啡的启示
20.1Mark IV型专用咖啡机
20.1.1规格说明书
20.1.2常见的丑陋方案
20.1.3虚构的抽象
20.1.4改进方案
20.1.5实现抽象模型
20.1.6这个设计的好处
20.2面向对象过度设计
20.3参考文献
第三部分薪水支付案例研究
第21章COMMAND模式和ACTIVE OBJECT模式:多功能与多任务
21.1简单的Command
21.2事务
21.2.1实体上解耦和时间上解耦
21.2.2时间上解耦
21.3Undo()方法
21.4ACTIVE OBJECT模式
21.5结论
21.6参考文献
第22章TEMPLATE METHOD模式和STRATEGY模式:继承和委托
22.1TEMPLATE METHOD模式
22.1.1滥用模式
22.1.2冒泡排序
22.2STRATEGY模式
22.3结论
22.4参考文献
第23章FACADE模式和MEDIATOR模式
23.1FACADE模式
23.2MEDIATOR模式
23.3结论
23.4参考文献
第24章SINGLETON模式和MONOSTATE模式
24.1SINGLETON模式
24.1.1SINGLETON模式的好处
24.1.2SINGLETON模式的代价
24.1.3运用SINGLETON模式
24.2MONOSTATE模式
24.2.1MONOSTATE模式的好处
24.2.2MONOSTATE模式的代价
24.2.3运用MONOSTATE模式
24.3结论
24.4参考文献
第25章NULL OBJECT模式
25.1描述
25.2结论
25.3参考文献
第26章薪水支付案例研究:第一次迭代开始
26.1初步的规格说明
26.2基于用例分析
26.2.1增加新雇员
26.2.2删除雇员
26.2.3登记考勤卡
26.2.4登记销售凭条
26.2.5登记工会服务费
26.2.6更改雇员明细
26.2.7发薪日
26.3反思:找出底层的抽象
26.3.1雇员支付类别抽象
26.3.2支付时间表抽象
26.3.3支付方式
26.3.4从属关系
26.4结论
26.5参考文献
第27章薪水支付案例研究:实现
27.1事务
27.1.1增加雇员
27.1.2删除雇员
27.1.3考勤卡、销售凭条以及服务费用
27.1.4更改雇员属性
27.1.5犯了什么晕
27.1.6支付雇员薪水
27.1.7支付领月薪的雇员薪水
27.1.8支付钟点工薪水
27.2主程序
27.3数据库
27.4结论
27.5关于本章
27.6参考文献
第四部分打包薪水支付系统
第28章包和组件的设计原则
28.1包和组件
28.2组件的内聚性原则:粒度
28.2.1重用—发布等价原则
28.2.2共同重用原则
28.2.3共同封闭原则
28.2.4组件内聚性总结
28.3组件的耦合性原则:稳定性
28.3.1无环依赖原则
28.3.2稳定依赖原则
28.3.3稳定抽象原则
28.4结论
第29章FACTORY模式
29.1依赖问题
29.2静态类型与动态类型
29.3可替换的工厂
29.4对测试支架使用对象工厂
29.5工厂的重要性
29.6结论
29.7参考文献
第30章薪水支付案例研究:包分析
30.1组件结构和符号
30.2应用CCP
30.3应用REP
30.4耦合和封装
30.5度量
30.6度量薪水支付应用程序
30.6.1对象工厂
30.6.2重新思考内聚的边界
30.7最终的包结构
30.8结论
30.9参考文献
第31章COMPOSITE模式
31.1组合命令
31.2多重性还是非多重性
31.3结论
第32章OBSERVER——演化至模式
32.1数字时钟
32.2OBSERVER模式
32.2.1模型
32.2.2面向对象设计原则的运用
32.3结论
32.4参考文献
第33章ABSTRACT SERVER模式、 ADAPTER模式和BRIDGE模式
33.1ABSTRACT SERVER模式
33.2ADAPTER模式
33.2.1类形式的ADAPTER模式
33.2.2调制解调器问题、适配器以及LSP
33.3BRIDGE模式
33.4结论
33.5参考文献
第34章PROXY模式和GATEWAY模式:管理第三方API
34.1PROXY模式
34.1.1实现PROXY模式
34.1.2小结
34.2数据库、中间件以及其他第三方接口
34.3TABLE DATA GATEWAY
34.3.1测试和内存TDG
34.3.2测试DbGateWay
34.4可以用于数据库的其他模式
34.5结论
34.6参考文献
第35章VISITOR模式
35.1VISITOR模式
35.2ACYCLIC VISITOR模式
35.3DECORATOR模式
35.4EXTENSION OBJECT模式
35.5结论
35.6参考文献
第36章STATE模式
36.1嵌套switch/case语句
36.1.1内部作用域的状态变量
36.1.2测试动作
36.1.3代价和收益
36.2迁移表
36.2.1使用表解释
36.2.2代价和收益
36.3STATE模式
36.3.1STATE模式和 STRATEGY模式
36.3.2代价和收益
36.4状态机编译器
36.4.1SMC生成的Turnstile.cs以及其他支持文件
36.4.2代价和收益
36.5状态机应用的场合
36.5.1作为GUI中的高层应用策略
36.5.2GUI交互控制器
36.5.3分布式处理
36.6结论
36.7参考文献
第37章薪水支付案例研究:数据库
37.1构建数据库
37.2一个代码设计缺陷
37.3增加雇员
37.4事务
37.5加载Employee对象
37.6还有什么工作
第38章薪水支付系统用户界面:Model-View-Presenter
38.1界面
38.2实现
38.3构建窗口
38.4Payroll窗口
38.5真面目
38.6结论
38.7参考文献
附录A双公司记
Rufus公司:“日落”项目
Rupert工业公司:“朝晖”项目
附录B什么是软件
索引



