7 袁慎建@ThoughtWorks

尚未进行身份认证

ThoughtWorks咨询师、培训师,健身爱好者

等级
TA的下载次数 215

JUnit 5 User Guide 中文版

JUnit 5官方用户指南(http://junit.org/junit5/docs/current/user-guide)的中文翻译(http://sjyuan.cc/junit5/user-guide-cn)

2018-01-01

Python基础教程(第2版).pdf

第1章 快速改造:基础知识 1.1 安装Python 1.1.1 Windows 1.1.2 Linux和UNIX 1.1.3 苹果机(Macintosh) 1.1.4 其他发行版本 1.1.5 时常关注,保持更新 1.2 交互式解释器 1.3 算法是什么 1.4 数字和表达式 1.4.1 长整数 1.4.2 十六进制和八进制 1.5 变量 1.6 语句 1.7 获取用户输入 1.8 函数 1.9 模块 1.9.1 cmath和复数 1.9.2 回到__future__ 1.10 保存并执行程序 1.10.1 通过命令提示符运行Python脚本 1.10.2 让脚本像普通程序一样运行 1.10.3 注释 1.11 字符串 1.11.1 单引号字符串和转义引号 1.11.2 拼接字符串 1.11.3 字符串表示,str和repr 1.11.4 input和raw_input的比较 1.11.5 长字符串、原始字符串和Unicode 1.12 小结 1.12.1 本章的新函数 1.12.2 接下来学什么 第2章 列表和元组 2.1 序列概览 2.2 通用序列操作 2.2.1 索引 2.2.2 分片 2.2.3 序列相加 2.2.4 乘法 2.2.5 成员资格 2.2.6 长度、最小值和最大值 2.3 列表:Python的“苦力” 2.3.1 list函数 2.3.2 基本的列表操作 2.3.3 列表方法 2.4 元组:不可变序列 2.4.1 tuple函数 2.4.2 基本元组操作 2.4.3 那么,意义何在 2.5 小结 2.5.1 本章的新函数 2.5.2 接下来学什么 第3章 使用字符串 3.1 基本字符串操作 3.2 字符串格式化:精简版 3.3 字符串格式化:完整版 3.3.1 简单转换 3.3.2 字段宽度和精度 3.3.3 符号、对齐和用0填充 3.4 字符串方法 3.4.1 find 3.4.2 join 3.4.3 lower 3.4.4 replace 3.4.5 split 3.4.6 strip 3.4.7 translate 3.5 小结 3.5.1 本章的新函数 3.5.2 接下来学什么 第4章 字典:当索引不好用时 4.1 字典的使用 4.2 创建和使用字典 4.2.1 dict函数 4.2.2 基本字典操作 4.2.3 字典的格式化字符串 4.2.4 字典方法 4.3 小结 4.3.1 本章的新函数 4.3.2 接下来学什么 第5章 条件、循环和其他语句 5.1 print和import的更多信息 5.1.1 使用逗号输出 5.1.2 把某件事作为另一件事导入 5.2 赋值魔法 5.2.1 序列解包 5.2.2 链式赋值 5.2.3 增量赋值 5.3 语句块:缩排的乐趣 5.4 条件和条件语句 5.4.1 这就是布尔变量的作用 5.4.2 条件执行和if语句 5.4.3 else子句 5.4.4 elif子句 5.4.5 嵌套代码块 5.4.6 更复杂的条件 5.4.7 断言 5.5 循环 5.5.1 while循环 5.5.2 for循环 5.5.3 循环遍历字典元素 5.5.4 一些迭代工具 5.5.5 跳出循环 5.5.6 循环中的else子句 5.6 列表推导式——轻量级循环 5.7 三人行 5.7.1 什么都没发生 5.7.2 使用del删除 5.7.3 使用exec和eval执行和求值字符串 5.8 小结 5.8.1 本章的新函数 5.8.2 接下来学什么 第6章 抽象 6.1 懒惰即美德 6.2 抽象和结构 6.3 创建函数 6.3.1 文档化函数 6.3.2 并非真正函数的函数 6.4 参数魔法 6.4.1 值从哪里来 6.4.2 我能改变参数吗 6.4.3 关键字参数和默认值 6.4.4 收集参数 6.4.5 参数收集的逆过程 6.4.6 练习使用参数 6.5 作用域 6.6 递归 6.6.1 两个经典:阶乘和幂 6.6.2 另外一个经典:二分法查找 6.7 小结 6.7.1 本章的新函数 6.7.2 接下来学什么 第7章 更加抽象 7.1 对象的魔力 7.1.1 多态 7.1.2 封装 7.1.3 继承 7.2 类和类型 7.2.1 类到底是什么 7.2.2 创建自己的类 7.2.3 特性、函数和方法 7.2.4 类的命名空间 7.2.5 指定超类 7.2.6 检查继承 7.2.7 多个超类 7.2.8 接口和内省 7.3 一些关于面向对象设计的思考 7.4 小结 7.4.1 本章的新函数 7.4.2 接下来学什么 第8章 异常 8.1 什么是异常 8.2 按自己的方式出错 8.2.1 raise语句 8.2.2 自定义异常类 8.3 捕捉异常 8.4 不止一个except子句 8.5 用一个块捕捉两个异常 8.6 捕捉对象 8.7 真正的全捕捉 8.8 万事大吉 8.9 最后…… 8.1 0异常和函数 8.1 1异常之禅 8.1 2小结 8.1 2.1 本章的新函数 8.1 2.2 接下来学什么 第9章 魔法方法、属性和迭代器 9.1 准备工作 9.2 构造方法 9.2.1 重写一般方法和特殊的构造方法 9.2.2 调用未绑定的超类构造方法 9.2.3 使用super函数 9.3 成员访问 9.3.1 基本的序列和映射规则 9.3.2 子类化列表,字典和字符串 9.4 更多魔力 9.5 属性 9.5.1 property函数 9.5.2 静态方法和类成员方法 9.5.3 __getattr__、__setattr__和它的朋友们 9.6 迭代器 9.6.1 迭代器规则 9.6.2 从迭代器得到序列 9.7 生成器 9.7.1 创建生成器 9.7.2 递归生成器 9.7.3 通用生成器 9.7.4 生成器方法 9.7.5 模拟生成器 9.8 八皇后问题 9.8.1 生成器和回溯 9.8.2 问题 9.8.3 状态表示 9.8.4 寻找冲突 9.8.5 基本情况 9.8.6 需要递归的情况 9.8.7 打包 9.9 小结 9.9.1 本章的新函数 9.9.2 接下来学什么 第10章 自带电池 10.1 模块 10.1.1 模块是程序 10.1.2 模块用于定义 10.1.3 让你的模块可用 10.1.4 包 10.2 探究模块 10.2.1 模块中有什么 10.2.2 用help获取帮助 10.2.3 文档 10.2.4 使用源代码 10.3 标准库:一些最爱 10.3.1 sys 10.3.2 os 10.3.3 fileinput 10.3.4 集合、堆和双端队列 10.3.5 time 10.3.6 random 10.3.7 shelve 10.3.8 re 10.3.9 其他有趣的标准模块 10.4 小结 10.4.1 本章的新函数 10.4.2 接下来学什么 第11章 文件和流 11.1 打开文件 11.1.1 文件模式 11.1.2 缓冲 11.2 基本的文件方法 11.2.1 读和写 11.2.2 管式输出 11.2.3 读写行 11.2.4 关闭文件 11.2.5 使用基本文件方法 11.3 对文件内容进行迭代 11.3.1 按字节处理 11.3.2 按行操作 11.3.3 读取所有内容 11.3.4 使用fileinput实现懒惰行迭代 11.3.5 文件迭代器 11.4 小结 11.4.1 本章的新函数 11.4.2 接下来学什么 第12章 图形用户界面 12.1 丰富的平台 12.2 下载和安装wxPython 12.3 创建示例GUI应用程序 12.3.1 开始 12.3.2 窗口和组件 12.3.3 标签、标题和位置 12.3.4 更智能的布局 12.3.5 事件处理 12.3.6 完成了的程序 12.4 但是我宁愿用…… 12.4.1 使用Tkinter 12.4.2 使用Jython和Swing 12.4.3 使用其他开发包 12.5 小结 第13章 数据库支持 13.1 Python数据库编程接口(API) 13.1.1 全局变量 13.1.2 异常 13.1.3 连接和游标 13.1.4 类型 13.2 SQLite和PySQLite 13.2.1 入门 13.2.2 数据库应用程序示例 13.3 小结 13.3.1 本章的新函数 13.3.2 接下来学什么 第14章 网络编程 14.1 少数几个网络设计模块 14.1.1 socket模块 14.1.2 urllib和urllib2模块 14.1.3 其他模块 14.2 SocketServer和它的朋友们 14.3 多个连接 14.3.1 使用SocketServer进行分叉和线程处理 14.3.2 带有select和poll的异步I/O 14.4 Twisted 14.4.1 下载并安装Twisted 14.4.2 编写Twisted服务器 14.5 小结 14.5.1 本章的新函数 14.5.2 接下来学什么 第15章 Python和Web 15.1 屏幕抓取 15.1.1 Tidy和XHTML解析 15.1.2 BeautifulSoup 15.2 使用CGI创建动态网页 15.2.1 第一步:准备网络服务器 15.2.2 第二步:加入PoundBang行 15.2.3 第三步:设置文件权限 15.2.4 CGI安全风险 15.2.5 简单的CGI脚本 15.2.6 使用cgitb调试 15.2.7 使用cgi模块 15.2.8 简单的表单 15.3 更进一步:mod_python 15.3.1 安装mod_python 15.3.2 CGI处理程序 15.3.3 PSP 15.3.4 发布 15.4 网络应用程序框架 15.5 Web服务:正确分析 15.5.1 RSS和相关内容 15.5.2 使用XML-RPC进行远程过程调用 15.5.3 SOAP 15.6 小结 15.6.1 本章的新函数 15.6.2 接下来学什么 第16章 测试 16.1 先测试,后编码 16.1.1 精确的需求说明 16.1.2 为改变而计划 16.1.3 测试的4个步骤 16.2 测试工具 16.2.1 doctest 16.2.2 unittest 16.3 单元测试以外的内容 16.3.1 使用PyChecker和PyLint检查源代码 16.3.2 性能分析 16.4 小结 16.4.1 本章的新函数 16.4.2 接下来学什么 第17章 扩展Python 17.1 考虑哪个更重要 17.2 非常简单的途径:Jython和IronPython 17.3 编写C语言扩展 17.3.1 SWIG 17.3.2 自己研究 17.4 小结 17.4.1 本章的新函数 17.4.2 接下来学什么 第18章 程序打包 18.1 Distutils基础 18.2 打包 18.2.1 建立存档文件 18.2.2 创建Windows安装程序或RPM包 18.3 编译扩展 18.4 使用py2exe创建可执行程序 18.5 小结 18.5.1 本章的新函数 18.5.2 接下来学什么 第19章 好玩的编程 19.1 为什么要好玩 19.2 程序设计的柔术 19.3 原型设计 19.4 配置 19.4.1 提取常量 19.4.2 配置文件 19.5 日志记录 19.6 如果还没烦 19.7 如果还想学 19.8 小结 第20章 项目1:即时标记 20.1 问题是什么 20.2 有用的工具 20.3 准备工作 20.4 初次实现 20.4.1 找出文本块 20.4.2 添加一些标记 20.5 再次实现 20.5.1 处理程序 20.5.2 处理程序的超类 20.5.3 规则 20.5.4 规则的超类 20.5.5 过滤器 20.5.6 分析器 20.5.7 构造规则和过滤器 20.5.8 整合 20.6 进一步探索 第21章 项目2:画幅好画 21.1 问题 21.2 有用的工具 21.3 准备工作 21.4 初次实现 21.4.1 用ReportLab画图 21.4.2 生成折线 21.4.3 编写原型 21.5 再次实现 21.5.1 获取数据 21.5.2 使用LinePlot类 21.6 进一步探索 第22章 项目3:万能的XML 22.1 问题 22.2 有用的工具 22.3 准备工作 22.4 初次实现 22.4.1 创建简单的内容处理器 22.4.2 生成HTML页面 22.5 再次实现 22.5.1 调度程序的混入类 22.5.2 实现首部、页脚和默认的处理程序 22.5.3 对目录的支持 22.5.4 事件处理程序 22.6 进一步探索 第23章 项目4:新闻聚合 23.1 问题 23.2 有用的工具 23.3 准备工作 23.4 初次实现 23.5 再次实现 23.6 进一步探索 第24章 项目5:虚拟茶话会 24.1 问题 24.2 有用的工具 24.3 准备工作 24.4 初次实现 24.4.1 ChatServer类 24.4.2 ChatSession类 24.4.3 整合 24.5 再次实现 24.5.1 基础命令解释 24.5.2 房间 24.5.3 登录和退出房间 24.5.4 主聊天室 24.5.5 新的服务器 24.6 进一步探索 第25章 项目6:使用CGI进行远程编辑 25.1 问题 25.2 有用的工具 25.3 准备工作 25.4 初次实现 25.5 再次实现 25.5.1 创建文件名表单 25.5.2 创建编辑器的脚本 25.5.3 编写保存脚本 25.5.4 运行编辑器 25.6 进一步探索 第26章 项目7:自定义电子公告板 26.1 问题 26.2 有用的工具 26.3 准备工作 26.4 初次实现 26.5 再次实现 26.5.1 编写Main脚本 26.5.2 编写View脚本 26.5.3 编写Edit脚本 26.5.4 编写Save脚本 26.5.5 尝试使用 26.6 进一步探索 第27章 项目8:使用XML-RPC进行文件共享 27.1 问题 27.2 有用的工具 27.3 准备工作 27.4 初次实现 27.4.1 实现一个简单的节点 27.4.2 尝试使用首次实现 27.5 再次实现 27.5.1 创建客户端界面 27.5.2 引发异常 27.5.3 验证文件名 27.5.4 尝试使用再次实现 27.6 进一步探索 第28章 项目9:文件共享2——GUI版本 28.1 问题 28.2 有用的工具 28.3 准备工作 28.4 初次实现 28.5 再次实现 28.6 进一步探索 第29章 项目10:DIY街机游戏 29.1 问题 29.2 有用的工具 29.2.1 pygame 29.2.2 pygame.locals 29.2.3 pygame.display 29.2.4 pygame.font 29.2.5 pygame.sprite 29.2.6 pygame.mouse 29.2.7 pygame.event 29.2.8 pygame.image 29.3 准备工作 29.4 初次实现 29.5 再次实现 29.6 进一步探索 附录A 简明版本 附录B Python参考手册 附录C 在线资源 附录D Python 3.0

2016-02-20

《python cookbook(第3版)》中文 高清完整PDF版

第1章 数据结构和算法 1 1.1 将序列分解为单独的变量 1 1.2 从任意长度的可迭代对象中分解元素 3 1.3 保存最后N个元素 5 1.4 找到最大或最小的N个元素 7 1.5 实现优先级队列 9 1.6 在字典中将键映射到多个值上 11 1.7 让字典保持有序 13 1.8 与字典有关的计算问题 14 1.9 在两个字典中寻找相同点 15 1.10 从序列中移除重复项且保持元素间顺序不变 17 1.11 对切片命名 18 1.12 找出序列中出现次数最多的元素 20 1.13 通过公共键对字典列表排序 22 1.14 对不原生支持比较操作的对象排序 23 1.15 根据字段将记录分组 25 1.16 筛选序列中的元素 26 1.17 从字典中提取子集 29 1.18 将名称映射到序列的元素中 30 1.19 同时对数据做转换和换算 33 1.20 将多个映射合并为单个映射 34 第2章 字符串和文本 37 2.1 针对任意多的分隔符拆分字符串 37 2.2 在字符串的开头或结尾处做文本匹配 38 2.3 利用Shell通配符做字符串匹配 40 2.4 文本模式的匹配和查找 42 2.5 查找和替换文本 45 2.6 以不区分大小写的方式对文本做查找和替换 47 2.7 定义实现最短匹配的正则表达式 48 2.8 编写多行模式的正则表达式 49 2.9 将Unicode文本统一表示为规范形式 50 2.10 用正则表达式处理Unicode字符 52 2.11 从字符串中去掉不需要的字符 53 2.12 文本过滤和清理 54 2.13 对齐文本字符串 57 2.14 字符串连接及合并 59 2.15 给字符串中的变量名做插值处理 62 2.16 以固定的列数重新格式化文本 64 2.17 在文本中处理HTML和XML实体 66 2.18 文本分词 67 2.19 编写一个简单的递归下降解析器 70 2.20 在字节串上执行文本操作 80 第3章 数字、日期和时间 83 3.1 对数值进行取整 83 3.2 执行精确的小数计算 85 3.3 对数值做格式化输出 87 3.4 同二进制、八进制和十六进制数打交道 89 3.5 从字节串中打包和解包大整数 90 3.6 复数运算 92 3.7 处理穷大和NaN 94 3.8 分数的计算 96 3.9 处理大型数组的计算 97 3.10 矩阵和线性代数的计算 101 3.11 随机选择 103 3.12 时间换算 105 3.13 计算上周5的日期 107 3.14 找出当月的日期范围 108 3.15 将字符串转换为日期 110 3.16 处理涉及到时区的日期问题 112 第4章 迭代器和生成器 114 4.1 手动访问迭代器中的元素 114 4.2 委托迭代 115 4.3 用生成器创建新的迭代模式 116 4.4 实现迭代协议 118 4.5 反向迭代 121 4.6 定义带有额外状态的生成器函数 122 4.7 对迭代器做切片操作 123 4.8 跳过可迭代对象中的前一部分元素 124 4.9 迭代所有可能的组合或排列 127 4.10 以索引-值对的形式迭代序列 129 4.11 同时迭代多个序列 131 4.12 在不同的容器中进行迭代 133 4.13 创建处理数据的管道 134 4.14 扁平化处理嵌套型的序列 137 4.15 合并多个有序序列,再对整个有序序列进行迭代 139 4.16 用迭代器取代while循环 140 第5章 文件和I/O 142 5.1 读写文本数据 142 5.2 将输出重定向到文件中 145 5.3 以不同的分隔符或行结尾符完成打印 145 5.4 读写二进制数据 146 5.5 对已不存在的文件执行写入操作 149 5.6 在字符串上执行I/O操作 150 5.7 读写压缩的数据文件 151 5.8 对固定大小的记录进行迭代 152 5.9 将二进制数据读取到可变缓冲区中 153 5.10 对二进制文件做内存映射 155 5.11 处理路径名 157 5.12 检测文件是否存在 158 5.13 获取目录内容的列表 159 5.14 绕过文件名编码 161 5.15 打印法解码的文件名 162 5.16 为已经打开的文件添加或修改编码方式 164 5.17 将字节数据写入文本文件 166 5.18 将已有的文件描述符包装为文件对象 167 5.19 创建临时文件和目录 169 5.20 同串口进行通信 171 5.21 序列化Python对象 172 第6章 数据编码与处理 177 6.1 读写CSV数据 177 6.2 读写JSON数据 181 6.3 解析简单的XML文档 186 6.4 以增量方式解析大型XML文件 188 6.5 将字典转换为XML 192 6.6 解析、修改和重写XML 194 6.7 用命名空间来解析XML文档 196 6.8 同关系型数据库进行交互 198 6.9 编码和解码十六进制数字 201 6.10 Base64编码和解码 202 6.11 读写二进制结构的数组 203 6.12 读取嵌套型和大小可变的二进制结构 207 6.13 数据汇总和统计 218 第7章 函数 221 7.1 编写可接受任意数量参数的函数 221 7.2 编写只接受关键字参数的函数 223 7.3 将元数据信息附加到函数参数上 224 7.4 从函数中返回多个值 225 7.5 定义带有默认参数的函数 226 7.6 定义匿名或内联函数 229 7.7 在匿名函数中绑定变量的值 230 7.8 让带有N个参数的可调用对象以较少的参数形式调用 232 7.9 用函数替代只有单个方法的类 235 7.10 在回调函数中携带额外的状态 236 7.11 内联回调函数 240 7.12 访问定义在闭包内的变量 242 第8章 类与对象 246 8.1 修改实例的字符串表示 246 8.2 自定义字符串的输出格式 248 8.3 让对象支持上下文管理协议 249 8.4 当创建大量实例时如何节省内存 251 8.5 将名称封装到类中 252 8.6 创建可管理的属性 254 8.7 调用父类中的方法 259 8.8 在子类中扩展属性 263 8.9 创建一种新形式的类属性或实例属性 267 8.10 让属性具有惰性求值的能力 271 8.11 简化数据结构的初始化过程 274 8.12 定义一个接口或抽象基类 278 8.13 实现一种数据模型或类型系统 281 8.14 实现自定义的容器 287 8.15 委托属性的访问 291 8.16 在类中定义多个构造函数 296 8.17 不通过调用init来创建实例 298 8.18 用Mixin技术来扩展类定义 299 8.19 实现带有状态的对象或状态机 305 8.20 调用对象上的方法,方法名以字符串形式给出 311 8.21 实现访问者模式 312 8.22 实现非递归的访问者模式 317 8.23 在环状数据结构中管理内存 324 8.24 让类支持比较操作 327 8.25 创建缓存实例 330 第9章 元编程 335 9.1 给函数添加一个包装 335 9.2 编写装饰器时如何保存函数的元数据 337 9.3 对装饰器进行解包装 339 9.4 定义一个可接受参数的装饰器 341 9.5 定义一个属性可由用户修改的装饰器 342 9.6 定义一个能接收可选参数的装饰器 346 9.7 利用装饰器对函数参数强制执行类型检查 348 9.8 在类中定义装饰器 352 9.9 把装饰器定义成类 354 9.10 把装饰器作用到类和静态方法上 357 9.11 编写装饰器为被包装的函数添加参数 359 9.12 利用装饰器给类定义打补丁 362 9.13 利用元类来控制实例的创建 364 9.14 获取类属性的定义顺序 367 9.15 定义一个能接受可选参数的元类 370 9.16 在*args和**kwargs上强制规定一种参数签名 372 9.17 在类中强制规定编码约定 375 9.18 通过编程的方式来定义类 378 9.19 在定义的时候初始化类成员 382 9.20 通过函数注解来实现方法重载 384 9.21 避免出现重复的属性方法 391 9.22 以简单的方式定义上下文管理器 393 9.23 执行带有局部副作用的代码 395 9.24 解析并分析Python源代码 398 9.25 将Python源码分解为字节码 402 第10章 模块和包 406 10.1 把模块按层次结构组织成包 406 10.2 对所有符号的导入进行精确控制 407 10.3 用相对名称来导入包中的子模块 408 10.4 将模块分解成多个文件 410 10.5 让各个目录下的代码在统一的命名空间下导入 413 10.6 重新加载模块 415 10.7 让目录或zip文件成为可运行的脚本 416 10.8 读取包中的数据文件 417 10.9 添加目录到sys.path中 418 10.10 使用字符串中给定的名称来导入模块

2016-02-20

Python Cookbook, 3rd Edition.pdf

第1章 数据结构和算法 1 1.1 将序列分解为单独的变量 1 1.2 从任意长度的可迭代对象中分解元素 3 1.3 保存最后N个元素 5 1.4 找到最大或最小的N个元素 7 1.5 实现优先级队列 9 1.6 在字典中将键映射到多个值上 11 1.7 让字典保持有序 13 1.8 与字典有关的计算问题 14 1.9 在两个字典中寻找相同点 15 1.10 从序列中移除重复项且保持元素间顺序不变 17 1.11 对切片命名 18 1.12 找出序列中出现次数最多的元素 20 1.13 通过公共键对字典列表排序 22 1.14 对不原生支持比较操作的对象排序 23 1.15 根据字段将记录分组 25 1.16 筛选序列中的元素 26 1.17 从字典中提取子集 29 1.18 将名称映射到序列的元素中 30 1.19 同时对数据做转换和换算 33 1.20 将多个映射合并为单个映射 34 第2章 字符串和文本 37 2.1 针对任意多的分隔符拆分字符串 37 2.2 在字符串的开头或结尾处做文本匹配 38 2.3 利用Shell通配符做字符串匹配 40 2.4 文本模式的匹配和查找 42 2.5 查找和替换文本 45 2.6 以不区分大小写的方式对文本做查找和替换 47 2.7 定义实现最短匹配的正则表达式 48 2.8 编写多行模式的正则表达式 49 2.9 将Unicode文本统一表示为规范形式 50 2.10 用正则表达式处理Unicode字符 52 2.11 从字符串中去掉不需要的字符 53 2.12 文本过滤和清理 54 2.13 对齐文本字符串 57 2.14 字符串连接及合并 59 2.15 给字符串中的变量名做插值处理 62 2.16 以固定的列数重新格式化文本 64 2.17 在文本中处理HTML和XML实体 66 2.18 文本分词 67 2.19 编写一个简单的递归下降解析器 70 2.20 在字节串上执行文本操作 80 第3章 数字、日期和时间 83 3.1 对数值进行取整 83 3.2 执行精确的小数计算 85 3.3 对数值做格式化输出 87 3.4 同二进制、八进制和十六进制数打交道 89 3.5 从字节串中打包和解包大整数 90 3.6 复数运算 92 3.7 处理穷大和NaN 94 3.8 分数的计算 96 3.9 处理大型数组的计算 97 3.10 矩阵和线性代数的计算 101 3.11 随机选择 103 3.12 时间换算 105 3.13 计算上周5的日期 107 3.14 找出当月的日期范围 108 3.15 将字符串转换为日期 110 3.16 处理涉及到时区的日期问题 112 第4章 迭代器和生成器 114 4.1 手动访问迭代器中的元素 114 4.2 委托迭代 115 4.3 用生成器创建新的迭代模式 116 4.4 实现迭代协议 118 4.5 反向迭代 121 4.6 定义带有额外状态的生成器函数 122 4.7 对迭代器做切片操作 123 4.8 跳过可迭代对象中的前一部分元素 124 4.9 迭代所有可能的组合或排列 127 4.10 以索引-值对的形式迭代序列 129 4.11 同时迭代多个序列 131 4.12 在不同的容器中进行迭代 133 4.13 创建处理数据的管道 134 4.14 扁平化处理嵌套型的序列 137 4.15 合并多个有序序列,再对整个有序序列进行迭代 139 4.16 用迭代器取代while循环 140 第5章 文件和I/O 142 5.1 读写文本数据 142 5.2 将输出重定向到文件中 145 5.3 以不同的分隔符或行结尾符完成打印 145 5.4 读写二进制数据 146 5.5 对已不存在的文件执行写入操作 149 5.6 在字符串上执行I/O操作 150 5.7 读写压缩的数据文件 151 5.8 对固定大小的记录进行迭代 152 5.9 将二进制数据读取到可变缓冲区中 153 5.10 对二进制文件做内存映射 155 5.11 处理路径名 157 5.12 检测文件是否存在 158 5.13 获取目录内容的列表 159 5.14 绕过文件名编码 161 5.15 打印法解码的文件名 162 5.16 为已经打开的文件添加或修改编码方式 164 5.17 将字节数据写入文本文件 166 5.18 将已有的文件描述符包装为文件对象 167 5.19 创建临时文件和目录 169 5.20 同串口进行通信 171 5.21 序列化Python对象 172 第6章 数据编码与处理 177 6.1 读写CSV数据 177 6.2 读写JSON数据 181 6.3 解析简单的XML文档 186 6.4 以增量方式解析大型XML文件 188 6.5 将字典转换为XML 192 6.6 解析、修改和重写XML 194 6.7 用命名空间来解析XML文档 196 6.8 同关系型数据库进行交互 198 6.9 编码和解码十六进制数字 201 6.10 Base64编码和解码 202 6.11 读写二进制结构的数组 203 6.12 读取嵌套型和大小可变的二进制结构 207 6.13 数据汇总和统计 218 第7章 函数 221 7.1 编写可接受任意数量参数的函数 221 7.2 编写只接受关键字参数的函数 223 7.3 将元数据信息附加到函数参数上 224 7.4 从函数中返回多个值 225 7.5 定义带有默认参数的函数 226 7.6 定义匿名或内联函数 229 7.7 在匿名函数中绑定变量的值 230 7.8 让带有N个参数的可调用对象以较少的参数形式调用 232 7.9 用函数替代只有单个方法的类 235 7.10 在回调函数中携带额外的状态 236 7.11 内联回调函数 240 7.12 访问定义在闭包内的变量 242 第8章 类与对象 246 8.1 修改实例的字符串表示 246 8.2 自定义字符串的输出格式 248 8.3 让对象支持上下文管理协议 249 8.4 当创建大量实例时如何节省内存 251 8.5 将名称封装到类中 252 8.6 创建可管理的属性 254 8.7 调用父类中的方法 259 8.8 在子类中扩展属性 263 8.9 创建一种新形式的类属性或实例属性 267 8.10 让属性具有惰性求值的能力 271 8.11 简化数据结构的初始化过程 274 8.12 定义一个接口或抽象基类 278 8.13 实现一种数据模型或类型系统 281 8.14 实现自定义的容器 287 8.15 委托属性的访问 291 8.16 在类中定义多个构造函数 296 8.17 不通过调用init来创建实例 298 8.18 用Mixin技术来扩展类定义 299 8.19 实现带有状态的对象或状态机 305 8.20 调用对象上的方法,方法名以字符串形式给出 311 8.21 实现访问者模式 312 8.22 实现非递归的访问者模式 317 8.23 在环状数据结构中管理内存 324 8.24 让类支持比较操作 327 8.25 创建缓存实例 330 第9章 元编程 335 9.1 给函数添加一个包装 335 9.2 编写装饰器时如何保存函数的元数据 337 9.3 对装饰器进行解包装 339 9.4 定义一个可接受参数的装饰器 341 9.5 定义一个属性可由用户修改的装饰器 342 9.6 定义一个能接收可选参数的装饰器 346 9.7 利用装饰器对函数参数强制执行类型检查 348 9.8 在类中定义装饰器 352 9.9 把装饰器定义成类 354 9.10 把装饰器作用到类和静态方法上 357 9.11 编写装饰器为被包装的函数添加参数 359 9.12 利用装饰器给类定义打补丁 362 9.13 利用元类来控制实例的创建 364 9.14 获取类属性的定义顺序 367 9.15 定义一个能接受可选参数的元类 370 9.16 在*args和**kwargs上强制规定一种参数签名 372 9.17 在类中强制规定编码约定 375 9.18 通过编程的方式来定义类 378 9.19 在定义的时候初始化类成员 382 9.20 通过函数注解来实现方法重载 384 9.21 避免出现重复的属性方法 391 9.22 以简单的方式定义上下文管理器 393 9.23 执行带有局部副作用的代码 395 9.24 解析并分析Python源代码 398 9.25 将Python源码分解为字节码 402 第10章 模块和包 406 10.1 把模块按层次结构组织成包 406 10.2 对所有符号的导入进行精确控制 407 10.3 用相对名称来导入包中的子模块 408 10.4 将模块分解成多个文件 410 10.5 让各个目录下的代码在统一的命名空间下导入 413 10.6 重新加载模块 415 10.7 让目录或zip文件成为可运行的脚本 416 10.8 读取包中的数据文件 417 10.9 添加目录到sys.path中 418 10.10 使用字符串中给定的名称来导入模块

2016-02-20

黑客与画家(中文版).pdf

1 为什么书呆子不受欢迎 他们的心思在别的地方。 2 黑客与画家 黑客也是创造者,与画家、建筑师、作家一样。 3 不能说的话 如果你的想法是社会无法容忍的,你怎么办? 4 良好的坏习惯 与其他美国人一样,黑客的成功秘诀就是打破常规。 5 另一条路 互联网软件是微机诞生后的最大机会。 6 如何创造财富 致富的最好方法就是为社会创造财富。创造财富的最好方法就是创业。 7 关注贫富分化 “收入分配不平等”的危害,会不会没有我们想的那样严重? 8 防止垃圾邮件的一种方法 不久前,许多专家还认为无法有效地过滤垃圾邮件。本文改变了他们的想法。 9 设计者的品味 如何做出优秀的东西? 10 编程语言解析 什么是编程语言?为什么它们现在很热门? 11 一百年后的编程语言 一百年后,人类怎样编程?为什么不从现在开始就这样编程呢? 12 拒绝平庸 别忘了你的对手与你一样,能用任何想用的语言编写互联网软件。 13 书呆子的复仇 在高科技行业,只有失败者采用“业界最佳实践”。 14 梦寐以求的编程语言 一种好的编程语言,是让黑客可以随心所欲使用的语言。 15 设计与研究 研究必须是“新”的,而设计必须是“好”的。 志谢 术语解释 图片授权说明

2015-10-23

代码整洁之道.pdf

第1章 整洁代码 1 1.1 要有代码 2 1.2 糟糕的代码 2 1.3 混乱的代价 3 1.3.1 华丽新设计 4 1.3.2 态度 4 1.3.3 迷题 5 1.3.4 整洁代码的艺术 5 1.3.5 什么是整洁代码 6 1.4 思想流派 10 1.5 我们是作者 11 1.6 童子军军规 12 1.7 前传与原则 12 1.8 小结 12 1.9 文献 13 第2章 有意义的命名 15 2.1 介绍 15 2.2 名副其实 16 2.3 避免误导 17 2.4 做有意义的区分 18 2.5 使用读得出来的名称 19 2.6 使用可搜索的名称 20 2.7 避免使用编码 21 2.7.1 匈牙利语标记法 21 2.7.2 成员前缀 21 2.7.3 接口和实现 22 2.8 避免思维映射 22 2.9  类名 23 2.10 方法名 23 2.11 别扮可爱 23 2.12 每个概念对应一个词 24 2.13 别用双关语 24 2.14 使用解决方案领域名称 25 2.15 使用源自所涉问题领域的名称 25 2.16 添加有意义的语境 25 2.17 不要添加没用的语境 27 2.18 最后的话 27 第3章 函数 29 3.1 短小 32 3.2 只做一件事 33 3.3 每个函数一个抽象层级 34 3.4 switch语句 35 3.5 使用描述性的名称 36 3.6 函数参数 37 3.6.1 一元函数的普遍形式 38 3.6.2 标识参数 38 3.6.3 二元函数 38 3.6.4 三元函数 39 3.6.5 参数对象 39 3.6.6 参数列表 40 3.6.7 动词与关键字 40 3.7 无副作用 40 3.8 分隔指令与询问 42 3.9 使用异常替代返回错误码 42 3.9.1 抽离Try/Catch代码块 43 3.9.2 错误处理就是一件事 44 3.9.3 Error.java依赖磁铁 44 3.10 别重复自己 44 3.11 结构化编程 45 3.12 如何写出这样的函数 45 3.13 小结 45 3.14 SetupTeardownIncluder程序 46 3.15 文献 48 第4章 注释 49 4.1 注释不能美化糟糕的代码 50 4.2 用代码来阐述 51 4.3 好注释 51 4.3.1 法律信息 51 4.3.2 提供信息的注释 51 4.3.3 对意图的解释 52 4.3.4 阐释 53 4.3.5 警示 53 4.3.6 TODO注释 54 4.3.7 放大 54 4.3.8 公共API中的Javadoc 55 4.4 坏注释 55 4.4.1 喃喃自语 55 4.4.2 多余的注释 56 4.4.3 误导性注释 58 4.4.4 循规式注释 58 4.4.5 日志式注释 59 4.4.6 废话注释 59 4.4.7 可怕的废话 61 4.4.8 能用函数或变量时就别用注释 62 4.4.9 位置标记 62 4.4.10 括号后面的注释 62 4.4.11 归属与署名 63 4.4.12 注释掉的代码 63 4.4.13 HTML注释 64 4.4.14 非本地信息 64 4.4.15 信息过多 65 4.4.16 不明显的联系 65 4.4.17 函数头 66 4.4.18 非公共代码中的Javadoc 66 4.4.19 范例 66 4.5 文献 69 第5章 格式 71 5.1 格式的目的 72 5.2 垂直格式 72 5.2.1 向报纸学习 73 5.2.2 概念间垂直方向上的区隔 73 5.2.3 垂直方向上的靠近 74 5.2.4 垂直距离 75 5.2.5 垂直顺序 79 5.3 横向格式 79 5.3.1 水平方向上的区隔与靠近 80 5.3.2 水平对齐 81 5.3.3 缩进 82 5.3.4 空范围 84 5.4 团队规则 84 5.5 鲍勃大叔的格式规则 85 第6章 对象和数据结构 87 6.1 数据抽象 87 6.2 数据、对象的反对称性 89 6.3 得墨忒耳律 91 6.3.1 火车失事 91 6.3.2 混杂 92 6.3.3 隐藏结构 92 6.4 数据传送对象 93 6.5 小结 94 6.6 文献 94 第7章 错误处理 95 7.1 使用异常而非返回码 96 7.2 先写Try-Catch-Finally语句 97 7.3 使用不可控异常 98 7.4 给出异常发生的环境说明 99 7.5 依调用者需要定义异常类 99 7.6 定义常规流程 100 7.7 别返回null值 101 7.8 别传递null值 102 7.9 小结 103 7.10 文献 104 第8章 边界 105 8.1 使用第三方代码 106 8.2 浏览和学习边界 107 8.3 学习log4j 108 8.4 学习性测试的好处不只是免费 110 8.5 使用尚不存在的代码 110 8.6 整洁的边界 111 8.7 文献 112 第9章 单元测试 113 9.1 TDD三定律 114 9.2 保持测试整洁 115 9.3 整洁的测试 116 9.3.1 面向特定领域的测试语言 118 9.3.2 双重标准 119 9.4 每个测试一个断言 121 9.5 F.I.R.S.T. 122 9.6 小结 123 9.7 文献 124 第10章 类 125 10.1 类的组织 126 10.2 类应该短小 126 10.2.1 单一权责原则 128 10.2.2 内聚 129 10.2.3 保持内聚性就会得到许多短小的类 130 10.3 为了修改而组织 136 10.4 文献 139 第11章 系统 141 11.1 如何建造一个城市 142 11.2 将系统的构造与使用分开 142 11.2.1 分解main 143 11.2.2 工厂 143 11.2.3 依赖注入 144 11.3 扩容 145 11.4 Java代理 148 11.5 纯Java AOP框架 150 11.6 AspectJ的方面 152 11.7 测试驱动系统架构 153 11.8 优化决策 154 11.9 明智使用添加了可论证价值的标准 154 11.10 系统需要领域特定语言 154 11.11 小结 155 11.12 文献 155 第12章 迭进 157 12.1 通过迭进设计达到整洁目的 157 12.2 简单设计规则1:运行所有测试 158 12.3 简单设计规则2~4:重构 158 12.4 不可重复 159 12.5 表达力 161 12.6 尽可能少的类和方法 162 12.7 小结 162 12.8 文献 162 第13章 并发编程 163 13.1 为什么要并发 164 13.2 挑战 165 13.3 并发防御原则 166 13.3.1 单一权责原则 166 13.3.2 推论:限制数据作用域 166 13.3.3 推论:使用数据复本 167 13.3.4 推论:线程应尽可能地独立 167 13.4 了解Java库 167 13.5 了解执行模型 168 13.5.1 生产者-消费者模型 169 13.5.2 读者-作者模型 169 13.5.3 宴席哲学家 169 13.6 警惕同步方法之间的依赖 169 13.7 保持同步区域微小 170 13.8 很难编写正确的关闭代码 170 13.9 测试线程代码 171 13.9.1 将伪失败看作可能的线程问题 171 13.9.2 先使非线程代码可工作 171 13.9.3 编写可插拔的线程代码 172 13.9.4 编写可调整的线程代码 172 13.9.5 运行多于处理器数量的线程 172 13.9.6 在不同平台上运行 172 13.9.7 装置试错代码 173 13.9.8 硬编码 173 13.9.9 自动化 174 13.10 小结 175 13.11 文献 175 第14章 逐步改进 176 14.1 Args的实现 177 14.2 Args:草稿 183 14.2.1 所以我暂停了 195 14.2.2 渐进 195 14.3 字符串参数 197 14.4 小结 234 第15章 JUnit内幕 235 15.1 JUnit框架 236 15.2 小结 249 第16章 重构SerialDate 251 16.1 首先,让它能工作 252 16.2 让它做对 254 16.3 小结 266 16.4 文献 267 第17章 味道与启发 269 17.1 注释 270 17.2 环境 271 17.3 函数 271 17.4 一般性问题 272 17.5 Java 288 17.6 名称 291 17.7 测试 294 17.8 小结 295 17.9 文献 296 附录A 并发编程II 297 A.1 客户端/服务器的例子 297 A.1.1 服务器 297 A.1.2 添加线程代码 298 A.1.3 观察服务器端 299 A.1.4 小结 301 A.2 执行的可能路径 301 A.2.1 路径数量 302 A.2.2 深入挖掘 303 A.2.3 小结 305 A.3 了解类库 305 A.3.1 Executor框架 305 A.3.2 非锁定的解决方案 306 A.3.3 非线程安全类 307 A.4 方法之间的依赖可能破坏并发代码 308 A.4.1 容忍错误 309 A.4.2 基于客户代码的锁定 309 A.4.3 基于服务端的锁定 311 A.5 提升吞吐量 312 A.5.1 单线程条件下的吞吐量 313 A.5.2 多线程条件下的吞吐量 313 A.6 死锁 314 A.6.1 互斥 315 A.6.2 上锁及等待 315 A.6.3 无抢先机制 315 A.6.4 循环等待 315 A.6.5 不互斥 316 A.6.6 不上锁及等待 316 A.6.7 满足抢先机制 317 A.6.8 不做循环等待 317 A.7 测试多线程代码 317 A.8 测试线程代码的工具支持 320 A.9 小结 320 A.10 教程:完整代码范例 321 A.10.1 客户端/服务器非线程代码 321 A.10.2 使用线程的客户端/服务器代码 324 附录B org.jfree.date.SerialDate 327 结束语 389

2015-10-23

程序员的职业素养.pdf

第1章  专业主义 1.1  清楚你要什么 1.2  担当责任 1.3  首先,不行损害之事 1.3.1  不要破坏软件功能 1.3.2  不要破坏结构 1.4  职业道德 1.4.1  了解你的领域 1.4.2  坚持学习 1.4.3  练习 1.4.4  合作 1.4.5  辅导 1.4.6  了解业务领域 1.4.7  与雇主/客户保持一致 1.4.8  谦逊 1.5  参考文献 第2章  说“不” 2.1  对抗角色 2.2  高风险时刻 2.3  要有团队精神 2.3.1  试试看 2.3.2  消极对抗 2.4  说“是”的成本 2.5  如何写出好代码 第3章  说“是” 3.1  承诺用语 3.1.1  识别“缺乏承诺”的征兆 3.1.2  真正的承诺听起来是怎样的 3.1.3  总结 3.2  学习如何说“是” 3.2.1  “试试”的另一面 3.2.2  坚守原则 3.3  结论 第4章  编码 4.1  做好准备 4.1.1  凌晨3点写出的代码 4.1.2  焦虑时写下的代码 4.2  流态区 4.2.1  音乐 4.2.2  中断 4.3  阻塞 4.4  调试 4.5  保持节奏 4.5.1  知道何时应该离开一会 4.5.2  开车回家路上 4.5.3  洗澡 4.6  进度延迟 4.6.1  期望 4.6.2  盲目冲刺 4.6.3  加班加点 4.6.4  交付失误 4.6.5  定义“完成” 4.7  帮助 4.7.1  帮助他人 4.7.2  接受他人的帮助 4.7.3  辅导 4.8  参考文献 第5章  测试驱动开发 5.1  此事已有定论 5.2  TDD的三项法则 5.3  TDD的优势 5.3.1  确定性 5.3.2  缺陷注入率 5.3.3  勇气 5.3.4  文档 5.3.5  设计 5.3.6  专业人士的选择 5.4  TDD的局限 5.5  参考文献 第6章  练习 6.1  引子 6.1.1  10的22次方 6.1.2  转变 6.2  编程柔道场 6.2.1  卡塔 6.2.2  瓦萨 6.2.3  自由练习 6.3  自身经验的拓展 6.3.1  开源 6.3.2  关于练习的职业道德 6.4  结论 6.5  参考文献 第7章  验收测试 7.1  需求的沟通 7.1.1  过早精细化 7.1.2  迟来的模糊性 7.2  验收测试 7.2.1  “完成”的定义 7.2.2  沟通 7.2.3  自动化 7.2.4  额外工作 7.2.5  验收测试什么时候写,由谁来写 7.2.6  开发人员的角色 7.2.7  测试的协商与被动推进 7.2.8  验收测试和单元测试 7.2.9  图形界面及其他复杂因素 7.2.10  持续集成 7.3  结论 第8章  测试策略 8.1  QA应该找不到任何错误 8.1.1  QA也是团队的一部分 8.1.2  需求规约定义者 8.1.3  特性描述者 8.2  自动化测试金字塔 8.2.1  单元测试 8.2.2  组件测试 8.2.3  集成测试 8.2.4  系统测试 8.2.5  人工探索式测试 8.3  结论 8.4  参考文献 第9章  时间管理 9.1  会议 9.1.1  拒绝 9.1.2  离席 9.1.3  确定议程与目标 9.1.4  立会 9.1.5  迭代计划会议 9.1.6  迭代回顾和DEMO展示 9.1.7  争论/反对 9.2  注意力点数 9.2.1  睡眠 9.2.2  咖啡因 9.2.3  恢复 9.2.4  肌肉注意力 9.2.5  输入与输出 9.3  时间拆分和番茄工作法 9.4  要避免的行为 9.5  死胡同 9.6  泥潭 9.7  结论 第10章  预估 10.1  什么是预估 10.1.1  承诺 10.1.2  预估 10.1.3  暗示性承诺 10.2  PERT 10.3  预估任务 10.4  大数定律 10.5  结论 10.6  参考文献 第11章  压力 11.1  避免压力 11.1.1  承诺 11.1.2  保持整洁 11.1.3  危机中的纪律 11.2  应对压力 11.2.1  不要惊慌失措 11.2.2  沟通 11.2.3  依靠你的纪律原则 11.2.4  寻求帮助 11.3  结论 第12章  协作 12.1  程序员与人 12.1.1  程序员与雇主 12.1.2  程序员与程序员 12.2  小脑 12.3  结论 第13章  团队与项目 13.1  只是简单混合吗 13.1.1  有凝聚力的团队 13.1.2  如何管理有凝聚力的团队 13.1.3  项目承包人的困境 13.2  结论 13.3  参考文献 第14章  辅导、学徒期与技艺 14.1  失败的学位教育 14.2  辅导 14.2.1  DIGI-COMP I, 我的第一台计算机 14.2.2  高中时代的ECP-18 14.2.3  非常规辅导 14.2.4  艰难的锤炼 14.3  学徒期 14.3.1  软件学徒期 14.3.2  现实情况 14.4  技艺 14.5  结论 附录  工具

2015-10-23

编写可读代码的艺术.pdf

前言 第1章 代码应当易于理解 是什么让代码变得“更好” 可读性基本定理 总是越小越好吗 理解代码所需的时间是否与其他目标有冲突 最难的部分 第一部分 表面层次的改进 第2章 把信息装到名字里 选择专业的词 避免像tmp和retval这样泛泛的名字 用具体的名字代替抽象的名字 为名字附带更多信息 名字应该有多长 利用名字的格式来传递含义 总结 第3章 不会误解的名字 例子:Filter() 例子:Clip(text, length) 推荐用first和last来表示包含的范围 推荐用begin和end来表示包含/排除范围 给布尔值命名 与使用者的期望相匹配 例子:如何权衡多个备选名字 总结 第4章 审美 为什么审美这么重要 重新安排换行来保持一致和紧凑 用方法来整理不规则的东西 在需要时使用列对齐 选一个有意义的顺序,始终一致地使用它 把声明按块组织起来 把代码分成“段落” 个人风格与一致性 总结 第5章 该写什么样的注释 什么不需要注释 记录你的思想 站在读者的角度 最后的思考--克服“作者心理阻滞” 总结 第6章 写出言简意赅的注释 让注释保持紧凑 避免使用不明确的代词 润色粗糙的句子 精确地描述函数的行为 用输入/输出例子来说明特别的情况 声明代码的意图 “具名函数参数”的注释 采用信息含量高的词 总结 第二部分 简化循环和逻辑 第7章 把控制流变得易读 条件语句中参数的顺序 if/else语句块的顺序 条件表达式(又名“三目运算符”) 避免do/while循环 从函数中提前返回 臭名昭著的goto 最小化嵌套 你能理解执行的流程吗 总结 第8章 拆分超长的表达式 用做解释的变量 总结变量 使用德摩根定理 滥用短路逻辑 例子:与复杂的逻辑战斗 拆分巨大的语句 另一个简化表达式的创意方法 总结 第9章 变量与可读性 减少变量 缩小变量的作用域 只写一次的变量更好 最后的例子 总结 第三部分 重新组织代码 第10章 抽取不相关的子问题 介绍性的例子:findClosestLocation() 纯工具代码 其他多用途代码 创建大量通用代码 项目专有的功能 简化已有接口 按需重塑接口 过犹不及 总结 第11章 一次只做一件事 任务可以很小 从对象中抽取值 更大型的例子 总结 第12章 把想法变成代码 清楚地描述逻辑 了解函数库是有帮助的 把这个方法应用于更大的问题 总结 第13章 少写代码 别费神实现那个功能--你不会需要它 质疑和拆分你的需求 保持小代码库 熟悉你周边的库 例子:使用Unix工具而非编写代码 总结 第四部分 精选话题 第14章 测试与可读性 使测试易于阅读和维护 这段测试什么地方不对 使这个测试更可读 让错误消息具有可读性 选择好的测试输入 为测试函数命名 那个测试有什么地方不对 对测试较好的开发方式 走得太远 总结 第15章 设计并改进“分钟/小时计数器” 问题 定义类接口 尝试1:一个幼稚的方案 尝试2:传送带设计方案 尝试3:时间桶设计方案 比较三种方案 总结 附录 深入阅读

2015-10-23

Head First 设计模式.pdf

引子 谁适合读这本书? 我们知道你的大脑在想什么 元认知 让你的大脑就范 技术审校 致谢 1 欢迎来到设计模式世界:设计模式入门 模拟鸭子应用 Joe想到继承 利用接口如何? 软件开发的不变真理 分开变化和不变部分 设计鸭子的行为 测试鸭子的代码 动态地设置行为 封装行为的大局观 “有一个”比“是一个”更好 策略模式 共享模式词汇的威力 我如何使用设计模式? 设计箱内的工具 习题解答 2 让你的对象知悉现况 气象观测站 认识观察者模式 出版者+订阅者=观罕者模式 五分钟短剧:观察主题 定义观察者模式 松耦合的威力 设计气象站 实现气象站 使用Java内建的观察者模式 java.util.Observable的黑暗面 设计箱内的工具 习题解答 …… 3 装饰者模式:装饰对象 4 工厂模式:烘烤OO的精华 5 单件模式:独一无二的对象 6 命令模式:封装调用 7 适配器模式与外观模式:随遇而安 8 模板方法模式:封装算法 9 送代器与组合模式:管理良好的集合 10 状态模式:事物的状态 11 代理模式:控制对象访问 12 复合模式:模式中的模式 13 与设计模式相处:真实世界中的模式 A 附录A:剩下的模式

2015-10-22

设计模式 可复用面向对象软件的基础.pdf

序言 前言 读者指南 第1章 引言 1.1 什么是设计模式 1.2 Smalltalk MVC中的设计模式 1.3 描述设计模式 1.4 设计模式的编目 1.5 组织编目 1.6 设计模式怎样解决设计问题 1.6.1 寻找合适的对象 1.6.2 决定对象的粒度 1.6.3 指定对象接口 1.6.4 描述对象的实现 1.6.5 运用复用机制 1.6.6 关联运行时刻和编译时刻的结构 1.6.7 设计应支持变化 1.7 怎样选择设计模式 1.8 怎样使用设计模式 第2章 实例研究:设计一个文档编辑器 2.1 设计问题 2.2 文档结构 2.2.1 递归组合 2.2.2 图元 2.2.3 组合模式 2.3 格式化 2.3.1 封装格式化算法 2.3.2 Compositor和Composition 2.3.3 策略模式 2.4 修饰用户界面 2.4.1 透明围栏 2.4.2 MonoGlyph 2.4.3 Decorator模式 2.5支持多种视感标准 2.5.1 对象创建的抽象 2.5.2 工厂类和产品类 2.5.3 Abstract Factory模式 2.6 支持多种窗口系统 2.6.1 我们是否可以使用Abstract Factory模式 2.6.2 封装实现依赖关系 2.6.3 Window和Windowlmp 2.6.4 Bridge模式 2.7 用户操作 2.7.1 封装一个请求 2.7.2 Command类及其子类 2.7.3 撤消和重做 2.7.4 命令历史记录 2.7.5 Command模式 2.8 拼写检查和断字处理 2.8.1 访问分散的信息 2.8.2 封装访问和遍历 2.8.3 Iterator类及其子类 2.8.4 Iterator模式 2.8.5 遍历和遍历过程中的动作 2.8.6 封装分析 2.8.7 Visitor类及其子类 2.8.8 Visitor模式 2.9小结 第3章 创建型模式 …… 第4章 结构型模式 …… 第5章 行为模式 …… 第6章 结论

2015-10-22

敏捷软件开发:原则、模式与实践.pdf

第Ⅰ部分 敏捷开发 第一章 敏捷实践 1.1 敏捷联盟 1.2 原则 1.3 结论 参考文献 第二章 极限编程概述 2.1 极限编程实践 2.2 结论 参考文献 第三章 计划 3.1 初始探索 3.2 发布计划 3.3 迭代计划 3.4 任务计划 3.5 迭代 3.6 结论 参考文献 第四章 测试 4.1 测试驱动的开发方法 4.2 验收测试 4.3 结论 参考文献 第五章 重构 5.1 素数产生程序一个简单的重构示例 5.2 结论 参考文献 第六章 一次编程实践 6.1 保龄球比赛 6.2 结论 第Ⅱ部分 敏捷设计 第七章 什么是敏捷设计 7.1 软件出了什么错 7.2 设计的臭味——腐化软件的气味 7.3 “Copy”程序 7.4 保持尽可能好的设计 7.5 结论 参考文献 第八章 单一责任原则(SRP) 8.1 单一职责原则(SRP) 8.2 结论 参考文献 第九章 开放—封闭原则(OCP) 9.1 开放—封闭原则(OCP) 9.2 描述 9.3 关键是抽象 9.4 结论 参考文献 第十章 Liskov替换原则(LSP) 10.1 Liskov替换原则(LSP) 10.2 一个违反LSP的简单例子 10.3 正方形和矩形,更微妙的违规 10.4 一个实际的例子 10.5 用提取公共部分的方法代替继承 10.6 启发式规则和习惯用法 10.7 结论 参考文献 第十一章 依赖倒置原则(DIP) 11.1 依赖倒置原则(DIP) 11.2 层次化 11.3 一个简单的例子 11.4 熔炉示例 11.5 结论 参考文献 第十二章 接口隔离原则(ISP) 12.1 接口污染 12.2 分离客户就是分离接口 12.3 接口隔离原则(ISP) 12.4 类接口与对象接口 12.5 ATM用户界面的例子 12.6 结论 参考文献 第Ⅲ部分 薪水支付案例研究 第十三章 COMMAND模式和ACTIVE OBJECT模式 第十四章 TEMPLATE METHOD模式和STRATEGY模式:继承与委托 第十五章 FACADE模式和MEDIATOR模式 第十六章 SINGLETON模式和MONOSTATE模式 第十七章 NULL OBJECT模式 第十八章 薪水支付案例研究:第一次迭代开始 第十九章 薪水支付案例研究:实现 第Ⅳ部分 打包薪水支付系统 第二十章 包的设计原则 第二十一章 FACTORY模式 第二十二章 薪水支付案例研究(第2部分) 第Ⅴ部分 气象站案例研究 第二十三章 COMPOSITE模式 第二十四章 OBSERVER模式——回归为模式 第二十五章 ABSTRACT SERVER模式、ADAPTER模式和BRIDGE模式 第二十六章 PROXY模式和STAIRWAY TO HEAVEN模式:管理第三方API 第二十七章 案例研究:气象站 第Ⅵ部分 ETS案例研究 第二十八章 VISITOR模式 第二十九章 STATE模式 第三十章 ETS框架 附录 附录A UML表示法Ⅰ:CGI示例 附录B UML表示法Ⅱ:统计多路复用器 附录C 两个公司的讽刺小品 附录D 源代码就是设计 索引

2015-10-22

重构-改善既有代码的设计 中文版.pdf

第1章 重构,第一个案例 1.1 起点 1.2 重构的第一步 1.3 分解并重组Statemen 1.4 运用多态取代与价格相关的条件逻辑 1.5 结语 第2章 重构原则 2.1 何谓重构 2.2 为何重构 2.3 何时重构 2.4 怎么对经理说 2.5 重构的难题 2.6 重构与设计 2.7 重构与性能 2.8 重构起源何处 第3章 代码的坏味道 3.1 Duplicated Code(重复的代码) 3.2 Long Method(过长函数) 3.3 Large Class(过大类) 3.4 Long Parameter List(过长参数列) 3.5 Divergent Change(发散式变化) 3.6 Shortgun Surgery(霰弹式修改) 3.7 Feature Envy(依恋情结) 3.8 Data Clumps(数据泥团) 3.9 Primitive Obsession(基本型别偏执) 3.10 Switch Statements(switch惊悚现身) 3.11 Parallel Inheritance Hierarchies(平行继承体系) 3.12 Lazy Class(冗赘类) 3.13 Speculative Generality(夸夸其谈未来性) 3.14 Temporary Field(令人迷惑的暂时值域) 3.15 Message Chai (过度耦合的消息链) 3.16 Middle Man(中间转手人) 3.17 Inappropriate Intimacy(狎昵关系) 3.18 Alternative Classes with Different Interfaces(异曲同工的类) 3.19 Incomplete Library Class(不完善的程序库类) 3.20 Data Class(纯稚的数据类) 3.21 Refused Bequest(被拒绝的遗赠) 3.22 Comments(过多的注释) 第4章 建立测试体系 4.1 自我测试码的价值 4.2 JUnit测试框架 4.3 添加更多测试 第5章 重构名录 5.1 重构的记录格式 5.2 寻找引用点 5.3 这些重构准则有多成熟 第6章 重新组织你的函数 6.1 Extract Method(提炼函数) 6.2 Inline Method(将函数内联化) 6.3 Inline Temp(将临时变量内联化) 6.4 Replace Temp With Query(以查询取代临时变量) 6.5 Introduce Explaining Variable(引入解释性变量) 6.6 Split Temporary Variable(剖解临时变量) 6.7 Remove Assignments to Paramete (移除对参数的赋值动作) 6.8 Replace Method with Method Object(以函数对象取代函数) 6.9 Substitute Algorithm(替换你的算法) 第7章 在对象之间移动特性 7.1 Move Method(搬移函数) 7.2 Move Field(搬移值域) 7.3 Extract Class(提炼类) 7.4 Inline Class(将类内联化) 7.5 Hide Delegate(隐藏「委托关系」) 7.6 Remove Middle Man(移除中间人) 7.7 Introduce Foreign Method(引入外加函数) 7.8 Introduce Local Exte ion(引入本地扩展) 第8章 重新组织你的数据 8.1 Self Encapsulate Field(自封装值域) 8.2 Replace Data Value with Object(以对象取代数据值) 8.3 Change Value to Reference(将实值对象改为引用对象) 8.4 Change Reference to Value(将引用对象改为实值对象) 8.5 Replace Array with Object(以对象取代数组) 8.6 Duplicate Observed Data(复制「被监视数据」) 8.7 Change Unidirectional Association to Bidirectional(将单向关联改为双向) 8.8 Change Bidirectional Association to Unidirectional(将双向关联改为单向) 8.9 Replace Magic Number with Symbolic Co tant (以符号常量/字面常量 取代魔法数) 8.10 Encapsulate Field(封装值域) 8.11 Encapsulate Collection(封装群集) 8.12 Replace Record with Data Class(以数据类取代记录) 8.13 Replace Type Code with Class(以类取代型别码) 8.14 Replace Type Code with Subclasses (以子类取代型别码) 8.15 Replace Type Code with State/Strategy (以State/Strategy取代型别码) 8.16 Replace Subclass with Fields(以值域取代子类) 第9章 简化条件表达式 9.1 Decompose Conditional(分解条件式) 9.2 Co olidate Conditional Expression(合并条件式) 9.3 Co olidate Duplicate Conditional Fragments (合并重复的条件片段) 9.4 Remove Control Flag(移除控制标记) 9.5 Replace Nested Conditional with Guard Clauses (以卫语句取代嵌套条件式) 9.6 Replace Conditional with Polymorphism(以多态取代条件式) 9.7 Introduce Null Object(引入Null对象) 9.8 Introduce Assertion(引入断言) 第10章 简化函数呼叫 10.1 Rename Method(重新命名函数) 10.2 Add Parameter(添加参数) 10.3 Remove Parameter(移除参数) 10.4 Separate Query from Modifier(将查询函数和修改函数分离) 10.5 Parameterize Method(令函数携带参数) 10.6 Replace Parameter with Explicit Methods(以明确函数取代参数) 10.7 Preserve Whole Object(保持对象完整) 10.8 Replace Parameter with Method(以函数取代参数) 10.9 Introduce Parameter Object(引入参数对象) 10.10 Remove Setting Method(移除设值函数) 10.11 Hide Method(隐藏你的函数) 10.12 Replace Co tructor with Factory Method(以工厂方法取代构造函数) 10.13 Encapsulate Downcast(封装「向下转型」动作) 10.14 Replace Error Code with Exception(以异常取代错误码) 10.15 Replace Exception with Test(以测试取代异常) 第11章 处理概括关系 11.1 Pull Up Field(值域上移) 11.2 Pull Up Method(函数上移) 11.3 Pull Up Co tructor Body(构造函数本体上移) 11.4 Push Down Method(函数下移) 11.5 Push Down Field(值域下移) 11.6 Extract Subclass(提炼子类) 11.7 Extract Superclass(提炼超类) 11.8 Extract Interface(提炼接口) 11.9 Collapse Hierarchy(折叠继承体系) 11.10 Form Template Method(塑造模板函数) 11.11 Replace Inheritance with Delegation(以委托取代继承) 11.12 Replace Delegation with Inheritance(以继承取代委托) 第12章 大型重构 12.1 Tease Apart Inheritance(疏理并分解继承体系) 12.2 Convert Procedural Design to Objects(将过程化设计转化为对象设计) 12.3 Separate Domain from Presentation(将领域和表述/显示分离) 12.4 Extract Hierarchy(提炼继承体系) 第13章 重构,复用,与现实 13.1 现实的检验 13.2 为什么开发者不愿意重构他们的程序 13.3 再论现实的检验 13.4 重构的资源和参考数据 13.5 从重构联想到软件复用和技术传播 13.6 结语 13.7 参考文献 第14章 重构工具 14.1 使用工具进行重构 14.2 重构工具的技术标准 14.3 重构工具的实用标准 14.4 小结 第15章 总结 参考书目 要点列表 索引

2015-10-22

硝烟中的Scrum和XP:我们如何实施Scrum

第1章 简介 免责声明 撰写本书的原因 scrum到底是什么 第2章 我们怎样编写产品backlog 额外的故事字段 我们如何让产品backlog停留在业务层次上 第3章 我们怎样准备sprint计划 第4章 我们怎样制定sprint计划 为什么产品负责人必须参加 为什么不能在质量上让步 无休止的sprint计划会议 sprint 计划会议日程 确定sprint长度 确定sprint目标 决定sprint要包含的故事 产品负责人如何对sprint放哪些故事产生影响 团队怎样决定把哪些故事放到sprint里面 用本能反应来估算 用生产率计算来估算 我们用的是哪种估算技术 我们为何使用索引卡 定义“完成” 使用计划扑克做时间估算 明确故事内容 把故事拆分成更小的故事 把故事拆分成任务 定下每日例会的时间地点 最后界限在哪里 技术故事 bug跟踪系统vs 产品backlog sprint计划会议终于结束了 第5章 我们怎样让别人了解我们的sprint 第6章 我们怎样编写sprint backlog 第7章 我们怎样布置团队房间 第8章 我们怎样进行每日例会 第9章 我们怎样进行sprint演示 第10章 我们怎样做sprint回顾 第11章 sprint之间的休整时刻 第12章 怎样制定发布计划 处理固定价格的合同 第13章 我们怎样结合使用scrum和xp 第14章 我们怎样做测试 第15章 我们怎样管理多个scrum团队 第16章 我们怎样管理分布式团队 第17章 scrummaster检查列表 第18章 结语 有关henrik kniberg">第1章 简介 免责声明 撰写本书的原因 scrum到底是什么 第2章 我们怎样编写产品backlog 额外的故事字段 我们如何让产品backlog停留在业务层次上 第3章 我们怎样准备sprint计划 第4章 我们怎样制定sprint计划 为什么产品负责人必须参 [更多]

2015-03-24

Scrum敏捷软件开发

《Scrum敏捷软件开发》是敏捷联盟及Scrum联盟创始人之一、敏捷估算及计划的鼻祖Mike Cohn三大经典著作中影响最为深厚的扛鼎之作,也是全球敏捷社区中获得广泛肯定的企业敏捷转型权威参考。作者花四年时间,把自己近十五年的敏捷实践经验,特别是近四年中针对各种敏捷转型企业的咨询和指导工作,并结合旁征博引的方式,从更高的思想层次对敏捷与Scrum多年来的经验和教训进行深入而前面的梳理和总结,最终集大成者便是这本令人醍醐灌顶的佳作。 《Scrum敏捷软件开发》是软件企业及其管理团队成功进行敏捷转型战略及实施的必备参考书,适合经理、开发人员、教练、ScrumMaster、产品负责人、分析师、团队领导或项目领导,是帮助他们成功完成项目,甚至造就敏捷企业的重要参考。 第Ⅰ部分 启航 第1章 为什么敏捷转型难(但值得) 第2章 ADAPT模型 第3章 Scrum实施模式 第4章 渐进敏捷 第5章 试点项目 第Ⅱ部分 个体 第6章 克服抵触 第7章 新角色 第8章 角色转换 第9章 技术实践 第Ⅲ部分 团队 第10章 团队结构 第11章 团队协作 第12章 领导自组织团队 第13章 产品Backlog 第14章 Sprint 第15章 做计划 第16章 质量 第Ⅳ部分 组织 第17章 扩展Scrum 第18章 分布式团队 第19章 与其他方法论共存 第20章 人力资源、后勤和PMO 第Ⅴ部分 下一站 第21章 看看进展如何 第22章 没有终点

2015-03-07

敏捷开发知识体系

《敏捷开发知识体系》面向敏捷实践者学习敏捷知识和敏捷软件开发企业进行敏捷转型的需要,旨在帮助个人更快地掌握敏捷开发知识,帮助企业更好地实施敏捷转型。主要内容包括:敏捷开发的哲学理念、价值观、敏捷开发方法框架和敏捷实践,企业敏捷转型参考框架,帮助企业回答为什么要进行敏捷转型,敏捷转型包含哪些内容和如何开展敏捷转型等问题。 第1章 敏捷开发知识体系总体框架 1.1 敏捷开发知识体系的核心 1.2 敏捷开发方法框架 1.3 敏捷开发管理实践 1.4 敏捷开发工程实践 第2章 敏捷开发核心价值观和原则 2.1 敏捷软件开发宣言 2.2 敏捷开发的核心价值观 2.3 敏捷开发的原则 2.3.1 敏捷开发的目标 2.3.2 敏捷开发原则的应用 第3章 敏捷开发方法框架 3.1 敏捷开发方法框架之Scrum 3.1.1 定义和特性说明 3.1.2 主要角色 3.1.3 主要活动和实践 3.1.4 主要工件 3.1.5 工作流程 3.2 敏捷开发方法框架之极限编程(XP) 3.2.1 定义和特性说明 3.2.2 主要角色 3.2.3 主要活动和实践 3.2.4 主要工件 3.2.5 工作流程 3.2.6 谁适合使用极限编程 3.3 敏捷开发方法框架之OpenUP 3.3.1 定义和特性说明 3.3.2 主要角色 3.3.3 主要活动和实践 3.3.4 主要工件 3.3.5 工作流程 3.3.6 谁适合使用OpenUP 3.4 敏捷开发方法框架之精益开发 3.4.1 定义和特性说明 3.4.2 主要角色 3.4.3 主要活动和实践 3.4.4 工作流程 3.4.5 谁更适合使用敏捷与精益相结合的方法 3.5 敏捷开发方法框架之特征驱动开发 3.5.1 定义和特性说明 3.5.2 主要角色 3.5.3 主要活动和实践 3.5.4 主要工件 3.5.5 工作流程 3.5.6 谁适合使用特征驱动开发 3.6 敏捷开发方法框架之水晶方法 3.6.1 主要角色 3.6.2 主要活动和实践 3.6.3 主要工件 3.6.4 主要流程 3.6.5 谁适合使用透明水晶方法 第4章 敏捷开发之管理实践 4.1 迭代式开发 4.1.1 定义和特性说明 4.1.2 应用说明 4.1.3 案例说明 4.2 多级项目规划 …… 第5章 敏捷开发之工程实践 第6章 企业敏捷转型参考框架 附录A 国外敏捷转型实践参考 附录B 敏捷开发术语表 附录C SPIChina服务介绍 附录D 中国敏捷软件开发联盟 参考文献

2015-03-07

查看更多

勋章 我的勋章
  • GitHub
    GitHub
    绑定GitHub第三方账户获取
  • 专栏达人
    专栏达人
    授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!