第1章 软件架构原理 1
1.1软件架构定义 2
1.1.1软件架构与设计 2
1.1.2软件架构相关的几个方面 3
1.2软件架构的特征 3
1.2.1用架构来定义一种结构 3
1.2.2由架构来挑选一组核心元素 4
1.2.3由架构来捕获早期的设计决策 4
1.2.4由架构来管理利益相关者的需求 5
1.2.5架构影响着组织结构 5
1.2.6架构受到环境的影响 6
1.2.7架构是对系统的文档化 6
1.2.8架构通常会遵循某个模式 7
1.3软件架构的重要性 7
1.4系统架构与企业架构 8
1.5架构的质量属性 10
1.5.1可修改性 11
1.5.2可测试性 13
1.5.3可扩展性 14
1.5.4性能 15
1.5.5可用性 16
1.5.6安全性 17
1.5.7可部署性 18
1.6本章小结 19
第2章 编写可修改可读的代码 20
2.1什么是可修改性 20
2.2与可修改性相关的几个方面 20
2.3理解可读性 21
2.3.1 Python和可读性 21
2.3.2可读性-反模式 22
2.4增强可读性的各种技术 24
2.4.1文档化代码 24
2.4.2遵守编码和风格规范 30
2.4.3审查和重构代码 31
2.4.4注释代码 31
2.5可修改性的基础——内聚和耦合 32
2.5.1测量内聚性和耦合性 33
2.5.2字符串和文本处理 35
2.6探索提高可修改性的策略 37
2.6.1提供显式接口 37
2.6.2减少双向依赖 37
2.6.3抽象出公共服务 38
2.6.4使用继承技术 38
2.6.5使用延迟绑定技术 42
2.7度量——静态分析工具 43
2.7.1什么是代码坏味道 43
2.7.2圈复杂度——McCabe度量 44
2.7.3度量结果测试 45
2.7.4运行静态检查器 47
2.8重构代码 53
2.8.1降低复杂度 53
2.8.2改善代码坏味道 55
2.8.3改善风格上和编码上的问题 57
2.9本章小结 57
第3章 可测试性——编写可测试的代码 58
3.1理解可测试性 58
3.1.1软件可测试性及相关属性 58
3.1.2架构级的方方面面 59
3.1.3策略 60
3.2白盒测试原理 65
3.2.1单元测试 65
3.2.2操作中的单元测试 66
3.2.3单元测试模块nose2 69
3.2.4用py.test进行测试 70
3.2.5代码覆盖 72
3.2.6仿制一些东西 74
3.2.7文档中的内联测试——doctest 78
3.2.8集成测试 81
3.2.9测试自动化 83
3.3测试驱动开发 84
3.4有回文的TDD 85
3.5本章小结 90
第4章 好的性能就是回报 92
4.1什么是性能 93
4.2软件性能工程 93
4.3性能测试和度量工具 94
4.4性能复杂度 95
4.5度量性能 96
4.5.1使用上下文管理器度量时间 97
4.5.2使用timeit模块来计时代码 99
4.5.3使用timeit度量代码的性能 100
4.5.4揭示时间复杂度——各种图 102
4.5.5使用timeit度量CPU时间 106
4.6剖析 107
4.6.1确定性剖析 107
4.6.2使用cProfile和profile进行剖析 108
4.6.3收集和报告统计数据 111
4.6.4第三方剖析器 113
4.7其他工具 119
4.7.1 objgraph 120
4.7.2 pympler 121
4.8程序设计性能——数据结构 123
4.8.1可变容器——链表、字典和集合 123
4.8.2不可变容器——元组 124
4.8.3高性能容器——集合模块 125
4.8.4概率数据结构——布隆过滤器 131
4.9本章小结 134
第5章 开发可扩展的应用 136
5.1可扩展性和性能 137
5.2并发性 139
5.2.1并发性与并行性 140
5.2.2 Python中的并发性——多线程机制 141
5.3缩略图产生器 141
5.3.1缩略图产生器——生产者/消费者架构 143
5.3.2缩略图产生器——使用锁的资源约束 147
5.3.3缩略图产生器——使用信号量的资源约束 150
5.3.4资源约束——信号量和锁比较 153
5.3.5缩略图产生器——使用条件的URL速率控制器 153
5.4多线程机制——Python和GIL 160
5.4.1 Python中的并发性——多进程机制 160
5.4.2质数检查器 161
5.4.3排序磁盘文件 163
5.5多线程与多进程比较 168
5.6先入为主的与合作的多任务处理 170
5.7 Python中的asyncio模块 173
5.8等待future对象——async和await 175
5.9 concurrent.future——高级并发处理 178
5.9.1磁盘缩略图产生器 179
5.9.2并发选项——如何选择? 181
5.10并行处理库 182
5.10.1 j oblib 182
5.10.2 PyMP 183
5.10.3 fractals——Mandelbrot集 184
5.11 Web扩展 189
5.11.1扩展工作流——消息队列和任务队列 189
5.11.2 Celery——一种分布式任务队列 190
5.11.3在Web上使用Python服务——WSGI 194
5.12可扩展架构 197
5.12.1垂直可扩展架构 197
5.12.2水平扩展架构 198
5.13本章小结 201
第6章 安全性——编写安全代码 202
6.1信息安全架构 202
6.2安全编码 203
6.3常见的安全漏洞 204
6.4 Python安全吗? 208
6.4.1读取输入 209
6.4.2任意输入求值 211
6.4.3溢出错误 214
6.4.4序列化对象 216
6.5 Web应用的安全问题 219
6.5.1服务器端模板注入 220
6.5.2服务器端模板注入——回避 222
6.5.3服务拒绝 223
6.5.4跨站脚本攻击 226
6.5.5回避——DoS和XSS 227
6.6 Python中的安全策略 228
6.7安全编码策略 234
6.8本章小结 234
第7章Python设计模式 236
7.1设计模式——元素 237
7.2设计模式分类 237
7.2.1可插拔的散列算法 238
7.2.2可插拔的散列算法总结 242
7.3 Python模式——创建模式 242
7.3.1单例模式 242
7.3.2工厂模式 248
7.3.3原型模式 250
7.3.4建造者模式 256
7.4 Python模式——结构化模式 261
7.4.1适配器模式 261
7.4.2外观模式 269
7.4.3代理模式 275
7.5 Python模式——行为模式 279
7.5.1迭代器模式 279
7.5.2观察者模式 282
7.5.3状态模式 288
7.6本章小结 293
第8章Python架构模式 295
8.1 M VC概述 296
8.1.1模型模板视图——Django 297
8.1.2Django管理——自动的以模型为中心的视图 297
8.1.3灵活的微框架——Flask 299
8.2事件驱动编程 300
8.2.1采用I/O多路复用select模块的聊天服务器和客户端 300
8.2.2事件驱动与并发编程 306
8.2.3 Twisted 306
8.2.4 Eventlet 313
8.2.5 Greenlet和Gevent 314
8.3微服务架构 316
8.3.1 Python中的微服务框架 317
8.3.2微服务实例——餐馆预订 317
8.3.3微服务的优点 320
8.4管道和过滤器架构 320
8.5本章小结 325
第9章 部署Python应用程序 326
9.1可部署性 327
9.1.1影响可部署性的因素 327
9.1.2软件部署架构的层次 328
9.2 Python软件部署 329
9.2.1给Python代码打包 329
9.2.2使用Fabric进行远程部署 340
9.2.3使用Ansible进行远程部署 341
9.2.4使用Supervisor管理远程守护进程 342
9.3部署——模式和最佳实践 343
9.4本章小结 344
第10章 各种用于调试的技术 346
10.1最大子阵列问题 347
10.1.1 “ print”的力量 348
10.1.2分析和重写 349
10.1.3代码计时和代码优化 351
10.2简单的调试技巧和技术 353
10.2.1词搜索器程序 353
10.2.2词搜索器程序——调试步骤1 354
10.2.3词搜索器程序——调试步骤2 355
10.2.4词搜索器程序——最终代码 356
10.2.5跳过代码块 357
10.2.6停止执行 357
10.2.7使用wrapper来控制外部依赖 358
10.2.8用函数的返回值或数据来替换函数(模拟) 359
10.3作为一种调试技术的日志记录 367
10.3.1简单的应用程序日志记录 368
10.3.2高级日志记录——日志记录器对象 369
10.4调试工具——使用各种调试器 374
10.4.1一个使用pdb的调试会话 375
10.4.2 pdb——两个相似的工具 377
10.5高级调试——跟踪 379
10.5.1 trace模块 379
10.5.2 lptrace程序 379
10.5.3使用strace的系统调用跟踪 380
10.6本章小结 381