本书首先解释如何利用Python语言实现应用软件架构,让您逐步理解什么是架构级的需求以及如何确定这些需求;然后,您可以获得对架构不同质量需求的完整理解,这些质量需求包括可维护性、可重用性、可测试性、可扩展性、性能、可用性和安全性等,进一步会帮助架构师构建满足业务需求的架构产品。
封面图
目录
- 译者序
- 关于作者
- 关于评审人
- 前言
- 第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.1Python和可读性 …… 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.1objgraph …… 120
- 4.7.2pympler …… 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.2Python中的并发性——多线程机制 …… 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.1Python中的并发性——多进程机制 …… 160
- 5.4.2质数检查器 …… 161
- 5.4.3排序磁盘文件 …… 163
- 5.5多线程与多进程比较 …… 168
- 5.6先入为主的与合作的多任务处理 …… 170
- 5.7Python中的asyncio模块 …… 173
- 5.8等待future对象——async和await …… 175
- 5.9concurrent.future——高级并发处理 …… 178
- 5.9.1磁盘缩略图产生器 …… 179
- 5.9.2并发选项——如何选择? …… 181
- 5.10并行处理库 …… 182
- 5.10.1joblib …… 182
- 5.10.2PyMP …… 183
- 5.10.3fractals —— Mandelbrot集 …… 184
- 5.11Web扩展 …… 189
- 5.11.1扩展工作流——消息队列和任务队列 …… 189
- 5.11.2Celery —— 一种分布式任务队列 …… 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.4Python安全吗? …… 208
- 6.4.1读取输入 …… 209
- 6.4.2任意输入求值 …… 211
- 6.4.3溢出错误 …… 214
- 6.4.4序列化对象 …… 216
- 6.5Web应用的安全问题 …… 219
- 6.5.1服务器端模板注入 …… 220
- 6.5.2服务器端模板注入——回避 …… 222
- 6.5.3服务拒绝 …… 223
- 6.5.4跨站脚本攻击 …… 226
- 6.5.5回避——DoS和XSS …… 227
- 6.6Python中的安全策略 …… 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.3Python模式——创建模式 …… 242
- 7.3.1单例模式 …… 242
- 7.3.2工厂模式 …… 248
- 7.3.3原型模式 …… 250
- 7.3.4建造者模式 …… 256
- 7.4Python模式——结构化模式 …… 261
- 7.4.1适配器模式 …… 261
- 7.4.2外观模式 …… 269
- 7.4.3代理模式 …… 275
- 7.5Python模式——行为模式 …… 279
- 7.5.1迭代器模式 …… 279
- 7.5.2观察者模式 …… 282
- 7.5.3状态模式 …… 288
- 7.6本章小结 …… 293
- 第8章Python架构模式 …… 295
- 8.1MVC概述 …… 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.3Twisted …… 306
- 8.2.4Eventlet …… 313
- 8.2.5Greenlet和Gevent …… 314
- 8.3微服务架构 …… 316
- 8.3.1Python中的微服务框架 …… 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.2Python软件部署 …… 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.2pdb——两个相似的工具 …… 377
- 10.5高级调试——跟踪 …… 379
- 10.5.1trace模块 …… 379
- 10.5.2lptrace程序 …… 379
- 10.5.3使用strace的系统调用跟踪 …… 380
- 10.6本章小结 …… 381