修改代码的艺术 = Working effectively with legacy code Xiu gai dai ma de yi shu = Working effectively with legacy code 🔍
[美]Michael C. Feathers 著,刘未鹏 译 [译, Michael C. Feathers 著,刘未鹏]
北京:人民邮电出版社, New York, New York State, 2009
中文 [zh] · PDF · 11.8MB · 2009 · 📘 非小说类图书 · 🚀/duxiu/lgli/zlib · Save
描述
小丫工作室 扫描制作,bizhub C252,200DPI
备用文件名
zlib/Computers/Programming/[美]Michael C. Feathers 著,刘未鹏 译 [译, Michael C. Feathers 著,刘未鹏]/修改代码的艺术_5743687.pdf
备选标题
Close Up
备选作者
(美)Michael C. Feathers著 ; 刘未鹏译; 费瑟; Athers Fe; 刘未鹏
备选作者
美 Michael C. Feathers 著,刘未鹏 译
备选作者
费瑟(Feathers, Michael)
备选作者
Virginia Kantra
备用出版商
The People's Posts and Telecommunications Publishing House
备用出版商
人民邮电出版社 Ren min you dian chu ban she
备用出版商
Random House, Incorporated
备用出版商
Penguin Publishing Group
备用出版商
Penguin Random House LLC
备用出版商
Penguin USA, Inc.
备用出版商
Berkley Sensation
备用版本
Tu ling cheng xu she ji cong shu. cheng xu yuan xiu lian xi lie, Di 1 ban, Beijing, 2007
备用版本
United States, United States of America
备用版本
China, People's Republic, China
备用版本
Di 1 ban, 北京 Beijing, 2007
元数据中的注释
Bookmarks: p1 (p2): 第一部分 修改机理
p2 (p2): 第1章 修改软件
p3 (p2): 1.1 修改软件的四个起因
p4 (p2): 1.1.1 添加特性和修正bug
p5 (p4): 1.1.2 改善设计
p6 (p4): 1.1.3 优化
p7 (p4): 1.1.4 综合起来
p8 (p6): 1.2 危险的修改
p9 (p8): 第2章 带着反馈工作
p10 (p10): 2.1 什么是单元测试
p11 (p12): 2.2 高层测试
p12 (p12): 2.3 测试覆盖
p13 (p15): 2.4 遗留代码修改算法
p14 (p16): 2.4.1 确定修改点
p15 (p16): 2.4.2 找出测试点
p16 (p16): 2.4.3 解依赖
p17 (p16): 2.4.4 编写测试
p18 (p17): 2.4.5 改动和重构
p19 (p17): 2.4.6 其他内容
p20 (p18): 第3章 感知和分离
p21 (p19): 3.1 伪装成合作者
p22 (p19): 3.1.1 伪对象
p23 (p22): 3.1.2 伪对象的两面性
p24 (p23): 3.1.3 伪对象手法的核心理念
p25 (p23): 3.1.4 仿对象
p26 (p25): 第4章 接缝模型
p27 (p25): 4.1 一大段文本
p28 (p26): 4.2 接缝
p29 (p29): 4.3 接缝类型
p30 (p29): 4.3.1 预处理期接缝
p31 (p32): 4.3.2 连接期接缝
p32 (p35): 4.3.3 对象接缝
p33 (p40): 第5章 工具
p34 (p40): 5.1 自动化重构工具
p35 (p42): 5.2 仿对象
p36 (p42): 5.3 单元测试用具
p37 (p43): 5.3.1 JUnit
p38 (p44): 5.3.2 CppUnitLite
p39 (p46): 5.3.3 NUnit
p40 (p46): 5.3.4 其他xUnit框架
p41 (p46): 5.4 一般测试用具
p42 (p47): 5.4.1 集成测试框架
p43 (p47): 5.4.2 Fitnesse
p44 (p50): 第二部分 修改代码的技术
p45 (p50): 第6章 时间紧迫,但必须修改
p46 (p52): 6.1 新生方法
p47 (p54): 6.2 新生类
p48 (p58): 6.3 外覆方法
p49 (p61): 6.4 外覆类
p50 (p66): 6.5 小结
p51 (p67): 第7章 漫长的修改
p52 (p67): 7.1 理解代码
p53 (p67): 7.2 时滞
p54 (p68): 7.3 解依赖
p55 (p73): 7.4 小结
p56 (p74): 第8章 添加特性
p57 (p74): 8.1 测试驱动开发
p58 (p75): 8.1.1 编写一个失败测试用例
p59 (p75): 8.1.2 让它通过编译
p60 (p75): 8.1.3 让测试通过
p61 (p76): 8.1.4 消除重复
p62 (p76): 8.1.5 编写一个失败测试用例
p63 (p76): 8.1.6 让它通过编译
p64 (p77): 8.1.7 让测试通过
p65 (p77): 8.1.8 消除重复代码
p66 (p77): 8.1.9 编写一个失败测试用例
p67 (p77): 8.1.10 让它通过编译
p68 (p78): 8.1.11 让测试通过
p69 (p79): 8.1.12 消除重复
p70 (p80): 8.2 差异式编程
p71 (p88): 8.3 小结
p72 (p89): 第9章 无法将类放入测试用具中
p73 (p89): 9.1 令人恼火的参数
p74 (p95): 9.2 隐藏依赖
p75 (p98): 9.3 构造块
p76 (p100): 9.4 恼人的全局依赖
p77 (p107): 9.5 可怕的包含依赖
p78 (p110): 9.6 “洋葱”参数
p79 (p112): 9.7 化名参数
p80 (p115): 第10章 无法在测试用具中运行方法
p81 (p115): 10.1 隐藏的方法
p82 (p118): 10.2 “有益的”语言特性
p83 (p121): 10.3 无法探知的副作用
p84 (p127): 第11章 修改时应当测试哪些方法
p85 (p127): 11.1 推测代码修改所产生的影响
p86 (p132): 11.2 前向推测
p87 (p137): 11.3 影响的传播
p88 (p138): 11.4 进行影响推测的工具
p89 (p140): 11.5 从影响分析当中学习
p90 (p141): 11.6 简化影响结构示意图
p91 (p144): 第12章 在同一地进行多处修改,是否应该将相关的所有类都解依赖
p92 (p145): 12.1 拦截点
p93 (p145): 12.1.1 简单的情形
p94 (p147): 12.1.2 高层拦截点
p95 (p150): 12.2 通过汇点来判断设计的好坏
p96 (p152): 12.3 汇点的陷阱
p97 (p153): 第13章 修改时应该怎样写测试
p98 (p153): 13.1 特征测试
p99 (p156): 13.2 刻画类
p100 (p157): 13.3 目标测试
p101 (p161): 13.4 编写特征测试的启发式方法
p102 (p162): 第14章 棘手的库依赖问题
p103 (p164): 第15章 到处都是API调用
p104 (p172): 第16章 对代码的理解不足
p105 (p172): 16.1 注记/草图
p106 (p173): 16.2 清单标注
p107 (p173): 16.2.1 职责分离
p108 (p174): 16.2.2 理解方法结构
p109 (p174): 16.2.3 方法提取
p110 (p174): 16.2.4 理解你的修改产生的影响
p111 (p174): 16.3 草稿式重构
p112 (p175): 16.4 删除不用的代码
p113 (p176): 第17章 应用毫无结构可言
p114 (p177): 17.1 讲述系统的故事
p115 (p180): 17.2 NakedCRC
p116 (p182): 17.3 反省你们的交流或讨论
p117 (p184): 第18章 测试代码碍手碍脚
p118 (p184): 18.1 类命名约定
p119 (p185): 18.2 测试代码放在哪儿
p120 (p187): 第19章 对非面向对象的项目,如何安全地对它进行修改
p121 (p187): 19.1 一个简单的案例
p122 (p188): 19.2 一个棘手的案例
p123 (p191): 19.3 添加新行为
p124 (p193): 19.4 利用面向对象的优势
p125 (p196): 19.5 一切都是面向对象
p126 (p199): 第20章 处理大类
p127 (p202): 20.1 职责识别
p128 (p213): 20.2 其他技术
p129 (p213): 20.3 继续前进
p130 (p213): 20.3.1 战略
p131 (p214): 20.3.2 战术
p132 (p215): 20.4 类提取之后
p133 (p216): 第21章 需要修改大量相同的代码
p134 (p232): 第22章 要修改一个巨型方法,却没法为它编写测试
p135 (p232): 22.1 巨型方法的种类
p136 (p232): 22.1.1 项目列表式方法
p137 (p233): 22.1.2 锯齿状方法
p138 (p236): 22.2 利用自动重构支持来对付巨型方法
p139 (p238): 22.3 手动重构的挑战
p140 (p239): 22.3.1 引入感知变量
p141 (p241): 22.3.2 只提取你所了解的
p142 (p243): 22.3.3 依赖收集
p143 (p243): 22.3.4 分解出方法对象
p144 (p244): 22.4 策略
p145 (p244): 22.4.1 主干提取
p146 (p244): 22.4.2 序列发现
p147 (p245): 22.4.3 优先提取到当前类中
p148 (p246): 22.4.4 小块提取
p149 (p246): 22.4.5 时刻准备重新提取
p150 (p247): 第23章 降低修改的风险
p151 (p247): 23.1 超感编辑
p152 (p248): 23.2 单一目标的编辑
p153 (p249): 23.3 签名保持
p154 (p251): 23.4 依靠编译器
p155 (p254): 第24章 当你感到绝望时
p156 (p258): 第三部分 解依赖技术
p157 (p258): 第25章 解依赖技术
p158 (p258): 25.1 参数适配
p159 (p261): 25.2 分解出方法对象
p160 (p266): 25.3 定义补全
p161 (p268): 25.4 封装全局引用
p162 (p273): 25.5 暴露静态方法
p163 (p275): 25.6 提取并重写调用
p164 (p276): 25.7 提取并重写工厂方法
p165 (p278): 25.8 提取并重写获取方法
p166 (p281): 25.9 实现提取
p167 (p283): 25.9.1 步骤
p168 (p284): 25.9.2 一个更复杂的例子
p169 (p285): 25.10 接口提取
p170 (p290): 25.11 引入实例委托
p171 (p292): 25.12 引入静态设置方法
p172 (p296): 25.13 连接替换
p173 (p297): 25.14 参数化构造函数
p174 (p301): 25.15 参数化方法
p175 (p302): 25.16 朴素化参数
p176 (p304): 25.17 特性提升
p177 (p307): 25.18 依赖下推
p178 (p310): 25.19 换函数为函数指针
p179 (p313): 25.20 以获取方法替换全局引用
p180 (p314): 25.21 子类化并重写方法
p181 (p317): 25.22 替换实例变量
p182 (p320): 25.23 模板重定义
p183 (p323): 25.24 文本重定义
p184 (p325): 附录 重构
p185 (p329): 术语表
p186 (p331): 索引
p2 (p2): 第1章 修改软件
p3 (p2): 1.1 修改软件的四个起因
p4 (p2): 1.1.1 添加特性和修正bug
p5 (p4): 1.1.2 改善设计
p6 (p4): 1.1.3 优化
p7 (p4): 1.1.4 综合起来
p8 (p6): 1.2 危险的修改
p9 (p8): 第2章 带着反馈工作
p10 (p10): 2.1 什么是单元测试
p11 (p12): 2.2 高层测试
p12 (p12): 2.3 测试覆盖
p13 (p15): 2.4 遗留代码修改算法
p14 (p16): 2.4.1 确定修改点
p15 (p16): 2.4.2 找出测试点
p16 (p16): 2.4.3 解依赖
p17 (p16): 2.4.4 编写测试
p18 (p17): 2.4.5 改动和重构
p19 (p17): 2.4.6 其他内容
p20 (p18): 第3章 感知和分离
p21 (p19): 3.1 伪装成合作者
p22 (p19): 3.1.1 伪对象
p23 (p22): 3.1.2 伪对象的两面性
p24 (p23): 3.1.3 伪对象手法的核心理念
p25 (p23): 3.1.4 仿对象
p26 (p25): 第4章 接缝模型
p27 (p25): 4.1 一大段文本
p28 (p26): 4.2 接缝
p29 (p29): 4.3 接缝类型
p30 (p29): 4.3.1 预处理期接缝
p31 (p32): 4.3.2 连接期接缝
p32 (p35): 4.3.3 对象接缝
p33 (p40): 第5章 工具
p34 (p40): 5.1 自动化重构工具
p35 (p42): 5.2 仿对象
p36 (p42): 5.3 单元测试用具
p37 (p43): 5.3.1 JUnit
p38 (p44): 5.3.2 CppUnitLite
p39 (p46): 5.3.3 NUnit
p40 (p46): 5.3.4 其他xUnit框架
p41 (p46): 5.4 一般测试用具
p42 (p47): 5.4.1 集成测试框架
p43 (p47): 5.4.2 Fitnesse
p44 (p50): 第二部分 修改代码的技术
p45 (p50): 第6章 时间紧迫,但必须修改
p46 (p52): 6.1 新生方法
p47 (p54): 6.2 新生类
p48 (p58): 6.3 外覆方法
p49 (p61): 6.4 外覆类
p50 (p66): 6.5 小结
p51 (p67): 第7章 漫长的修改
p52 (p67): 7.1 理解代码
p53 (p67): 7.2 时滞
p54 (p68): 7.3 解依赖
p55 (p73): 7.4 小结
p56 (p74): 第8章 添加特性
p57 (p74): 8.1 测试驱动开发
p58 (p75): 8.1.1 编写一个失败测试用例
p59 (p75): 8.1.2 让它通过编译
p60 (p75): 8.1.3 让测试通过
p61 (p76): 8.1.4 消除重复
p62 (p76): 8.1.5 编写一个失败测试用例
p63 (p76): 8.1.6 让它通过编译
p64 (p77): 8.1.7 让测试通过
p65 (p77): 8.1.8 消除重复代码
p66 (p77): 8.1.9 编写一个失败测试用例
p67 (p77): 8.1.10 让它通过编译
p68 (p78): 8.1.11 让测试通过
p69 (p79): 8.1.12 消除重复
p70 (p80): 8.2 差异式编程
p71 (p88): 8.3 小结
p72 (p89): 第9章 无法将类放入测试用具中
p73 (p89): 9.1 令人恼火的参数
p74 (p95): 9.2 隐藏依赖
p75 (p98): 9.3 构造块
p76 (p100): 9.4 恼人的全局依赖
p77 (p107): 9.5 可怕的包含依赖
p78 (p110): 9.6 “洋葱”参数
p79 (p112): 9.7 化名参数
p80 (p115): 第10章 无法在测试用具中运行方法
p81 (p115): 10.1 隐藏的方法
p82 (p118): 10.2 “有益的”语言特性
p83 (p121): 10.3 无法探知的副作用
p84 (p127): 第11章 修改时应当测试哪些方法
p85 (p127): 11.1 推测代码修改所产生的影响
p86 (p132): 11.2 前向推测
p87 (p137): 11.3 影响的传播
p88 (p138): 11.4 进行影响推测的工具
p89 (p140): 11.5 从影响分析当中学习
p90 (p141): 11.6 简化影响结构示意图
p91 (p144): 第12章 在同一地进行多处修改,是否应该将相关的所有类都解依赖
p92 (p145): 12.1 拦截点
p93 (p145): 12.1.1 简单的情形
p94 (p147): 12.1.2 高层拦截点
p95 (p150): 12.2 通过汇点来判断设计的好坏
p96 (p152): 12.3 汇点的陷阱
p97 (p153): 第13章 修改时应该怎样写测试
p98 (p153): 13.1 特征测试
p99 (p156): 13.2 刻画类
p100 (p157): 13.3 目标测试
p101 (p161): 13.4 编写特征测试的启发式方法
p102 (p162): 第14章 棘手的库依赖问题
p103 (p164): 第15章 到处都是API调用
p104 (p172): 第16章 对代码的理解不足
p105 (p172): 16.1 注记/草图
p106 (p173): 16.2 清单标注
p107 (p173): 16.2.1 职责分离
p108 (p174): 16.2.2 理解方法结构
p109 (p174): 16.2.3 方法提取
p110 (p174): 16.2.4 理解你的修改产生的影响
p111 (p174): 16.3 草稿式重构
p112 (p175): 16.4 删除不用的代码
p113 (p176): 第17章 应用毫无结构可言
p114 (p177): 17.1 讲述系统的故事
p115 (p180): 17.2 NakedCRC
p116 (p182): 17.3 反省你们的交流或讨论
p117 (p184): 第18章 测试代码碍手碍脚
p118 (p184): 18.1 类命名约定
p119 (p185): 18.2 测试代码放在哪儿
p120 (p187): 第19章 对非面向对象的项目,如何安全地对它进行修改
p121 (p187): 19.1 一个简单的案例
p122 (p188): 19.2 一个棘手的案例
p123 (p191): 19.3 添加新行为
p124 (p193): 19.4 利用面向对象的优势
p125 (p196): 19.5 一切都是面向对象
p126 (p199): 第20章 处理大类
p127 (p202): 20.1 职责识别
p128 (p213): 20.2 其他技术
p129 (p213): 20.3 继续前进
p130 (p213): 20.3.1 战略
p131 (p214): 20.3.2 战术
p132 (p215): 20.4 类提取之后
p133 (p216): 第21章 需要修改大量相同的代码
p134 (p232): 第22章 要修改一个巨型方法,却没法为它编写测试
p135 (p232): 22.1 巨型方法的种类
p136 (p232): 22.1.1 项目列表式方法
p137 (p233): 22.1.2 锯齿状方法
p138 (p236): 22.2 利用自动重构支持来对付巨型方法
p139 (p238): 22.3 手动重构的挑战
p140 (p239): 22.3.1 引入感知变量
p141 (p241): 22.3.2 只提取你所了解的
p142 (p243): 22.3.3 依赖收集
p143 (p243): 22.3.4 分解出方法对象
p144 (p244): 22.4 策略
p145 (p244): 22.4.1 主干提取
p146 (p244): 22.4.2 序列发现
p147 (p245): 22.4.3 优先提取到当前类中
p148 (p246): 22.4.4 小块提取
p149 (p246): 22.4.5 时刻准备重新提取
p150 (p247): 第23章 降低修改的风险
p151 (p247): 23.1 超感编辑
p152 (p248): 23.2 单一目标的编辑
p153 (p249): 23.3 签名保持
p154 (p251): 23.4 依靠编译器
p155 (p254): 第24章 当你感到绝望时
p156 (p258): 第三部分 解依赖技术
p157 (p258): 第25章 解依赖技术
p158 (p258): 25.1 参数适配
p159 (p261): 25.2 分解出方法对象
p160 (p266): 25.3 定义补全
p161 (p268): 25.4 封装全局引用
p162 (p273): 25.5 暴露静态方法
p163 (p275): 25.6 提取并重写调用
p164 (p276): 25.7 提取并重写工厂方法
p165 (p278): 25.8 提取并重写获取方法
p166 (p281): 25.9 实现提取
p167 (p283): 25.9.1 步骤
p168 (p284): 25.9.2 一个更复杂的例子
p169 (p285): 25.10 接口提取
p170 (p290): 25.11 引入实例委托
p171 (p292): 25.12 引入静态设置方法
p172 (p296): 25.13 连接替换
p173 (p297): 25.14 参数化构造函数
p174 (p301): 25.15 参数化方法
p175 (p302): 25.16 朴素化参数
p176 (p304): 25.17 特性提升
p177 (p307): 25.18 依赖下推
p178 (p310): 25.19 换函数为函数指针
p179 (p313): 25.20 以获取方法替换全局引用
p180 (p314): 25.21 子类化并重写方法
p181 (p317): 25.22 替换实例变量
p182 (p320): 25.23 模板重定义
p183 (p323): 25.24 文本重定义
p184 (p325): 附录 重构
p185 (p329): 术语表
p186 (p331): 索引
备用描述
Deep in the shadows of North Carolina's Nantahala forest, two strangers find themselves running from danger-and straight to each other...Lexie Scott may be the FBI director's daughter, but she's struggled her whole life to stay out of trouble and avoid the spotlight. When she's kidnapped by a survivalist group bent on teaching her father a lesson, however, she must summon the courage she never knew she had. Lexie escapes their wilderness headquarters-only to find that she's not alone in the woods...Suspended cop Jack Miller came to North Carolina to rescue his sister from her abusive marriage to the survivalists' charismatic leader. Coming to Lexie's aid can only compromise Jack's plans. But he can't ignore Lexie's plight...or resist her appeal.Tall, dark and rough-around-the-edges has never been Lexie's type. But in the lush, shadowy forest, Lexie has no choice but to trust this intimidating stranger. She's just not sure she can trust her heart...
备用描述
本书针对大型的, 无测试的遗留代码基, 提供了从头到尾的方案, 让你能够更有效地应付它们, 将你的遗留代码基改善得具有更高性能, 更多功能, 更好的可靠性和可控性.本书还包括了一组共24项解依赖技术, 它们能帮助你单独对付代码中的问题片段, 并实现更安全的修改
开源日期
2020-09-03
🚀 快速下载
成为会员以支持书籍、论文等的长期保存。为了感谢您对我们的支持,您将获得高速下载权益。❤️
🐢 低速下载
由可信的合作方提供。 更多信息请参见常见问题解答。 (可能需要验证浏览器——无限次下载!)
- 低速服务器(合作方提供) #1 (稍快但需要排队)
- 低速服务器(合作方提供) #2 (稍快但需要排队)
- 低速服务器(合作方提供) #3 (稍快但需要排队)
- 低速服务器(合作方提供) #4 (稍快但需要排队)
- 低速服务器(合作方提供) #5 (无需排队,但可能非常慢)
- 低速服务器(合作方提供) #6 (无需排队,但可能非常慢)
- 低速服务器(合作方提供) #7 (无需排队,但可能非常慢)
- 低速服务器(合作方提供) #8 (无需排队,但可能非常慢)
- 低速服务器(合作方提供) #9 (无需排队,但可能非常慢)
- 下载后: 在我们的查看器中打开
所有选项下载的文件都相同,应该可以安全使用。即使这样,从互联网下载文件时始终要小心。例如,确保您的设备更新及时。
外部下载
-
对于大文件,我们建议使用下载管理器以防止中断。
推荐的下载管理器:JDownloader -
您将需要一个电子书或 PDF 阅读器来打开文件,具体取决于文件格式。
推荐的电子书阅读器:Anna的档案在线查看器、ReadEra和Calibre -
使用在线工具进行格式转换。
推荐的转换工具:CloudConvert和PrintFriendly -
您可以将 PDF 和 EPUB 文件发送到您的 Kindle 或 Kobo 电子阅读器。
推荐的工具:亚马逊的“发送到 Kindle”和djazz 的“发送到 Kobo/Kindle” -
支持作者和图书馆
✍️ 如果您喜欢这个并且能够负担得起,请考虑购买原版,或直接支持作者。
📚 如果您当地的图书馆有这本书,请考虑在那里免费借阅。
下面的文字仅以英文继续。
总下载量:
“文件的MD5”是根据文件内容计算出的哈希值,并且基于该内容具有相当的唯一性。我们这里索引的所有影子图书馆都主要使用MD5来标识文件。
一个文件可能会出现在多个影子图书馆中。有关我们编译的各种数据集的信息,请参见数据集页面。
有关此文件的详细信息,请查看其JSON 文件。 Live/debug JSON version. Live/debug page.