[日] 松本行弘 ◎著 《松本行弘的程序世界》
本书是作者在月刊杂志《日经Linux》上专栏《松本行弘:模式》各期(2005年5月号~2009年4月号)的合集,2011年8月第1版出版。
目录
1 我为什么开发Ruby
1.1 我为什么开发Ruby
- 编程语言的重要性
- Ruby的原则
- 简洁性
- 扩展性
- 稳定性
- 一切皆因兴趣
2 面向对象
2.1 编程和面向对象的关系
- 颠倒的构造
- 主宰计算机的武器
- 怎样写程序
- 面向对象的编程方法
- 面向对象的难点
- 多态性
- 具体的程序
- 多态性的优点
2.2 数据抽象和继承
- 面向对象的历史
- 复杂性是面向对象的敌人
- 结构化编程
- 数据抽象化
- 雏形
- 找出相似的部分来继承
2.3 多重继承的缺点
- 为什么需要多重继承
- 多重继承和单一继承不可分离
- goto语句和多重继承比较相似
- 解决多重继承的问题
- 静态语言和动态语言的区别
- 静态语言的特点
- 动态语言的特点
- 静态语言和动态语言的比较
- 继承的两种含义
- 接口的缺点
- 继承实现的方法
- 从多重继承变形而来的Mix-in
- 积极支持Mix-in的Ruby
2.4 两个误解
- 面向对象的编程
- 对象的模板=类
- 利用模板的手段=继承
- 多重继承不好吗
- 动态编程语言也需要多重继承
- 驯服多重继承的方法
- Ruby中多重继承的实现方法
- Java实现多重继承的方法
2.5 Duck Typing诞生之前
- 为什么需要类型
- 动态的类型是从Lisp中诞生的
- 动态类型在面向对象中发展起来了
- 动态类型和静态类型的邂逅
- 静态类型的优点
- 动态类型的优点
- 只关心行为的Duck Typing
- 避免明确的类型检查
- 克服动态类型的缺点
- 动态编程语言
2.6 元编程
- 元编程
- 反射
- 元编程的例子
- 使用反射功能
- 分布式Ruby的实现
- 数据库的应用
- 输出XML
- 元编程和小编程语言
- 声明的实现
- 上下文相关的实现
- 单位的实现
- 词汇的实现
- 层次数据的实现
- 适合DSL的语言,不适合DSL的语言
3 程序块
3.1 程序块的威力
- 把函数作为参数的高阶函数
- C语言高阶函数的局限
- 可以保存外部环境的闭包
- 块的两种使用方法
- 最终来看,块到底是什么
- 块在循环处理中的应用
- 内部迭代器和外部迭代器
- 在排序和比较大小中的应用
- 用块保证程序的后处理
- 用块实现新的控制结构
- 在回调中使用块
3.2 用块作循环
- 块是处理的集合
- 块应用范围的扩展
- 高阶函数和块的本质一样
- 用Enumerable来利用块
- Enumerable的局限
3.3 精通集合的使用
- 使用Ruby的数组
- 修改限定范围的元素内容
- Ruby中的哈希处理
- 支持循环的Enumerable
- 用于循环的each方法
- 使用inject、zip和grep
- 用来指定条件的select方法
- 排序与比较大小的方法
- 在类中包含(include)Enumerable模块
- 列表内包表达式和块的区别
4 设计模式
4.1 设计模式(1)
- 设计模式的价值和意义
- 设计模式是程序抽象化的延伸
- Ruby中的设计模式
- Sigleton模式
- Proxy模式
- Iterator模式
- 外部与内部,那一个更好
- 内部迭代器的缺陷
- 外部迭代器的缺点
4.2 设计模式(2)
- 模式与动态语言的关系
- 重复使用既存对象的Prototype模式
- 亲身体验Io语言
- Ruby中的原型
- 编写抽象算法的Template Method模式
- 用Ruby来尝试Template Method
- 动态语言与Template Method模式
- 避免高度依赖性的Observer模式
- Observable模块
- Observer模式与动态语言
4.3 设计模式(3)
- 软件开发的悲剧
- 开放-封闭原则
- 面向对象的情况
- 非面向对象的情况
- OCP与Template Method模式
- Observer模式
- 使用Strategy模式
- Strategy模式与OCP
5 Ajax
5.1 Ajax和JavaScript(前篇)
- 同行及异步页面更新
- 技术要素之一:JavaScript
- 技术要素之二:XML
- XML以外的数据表现形式
- 技术要素之三:DHTML
- JavaScript技术基础
- 原型模式的面向对象编程语言
- 使用prototype.js库
- prototype.js的功能
5.2 Ajax和JavaScript(后篇)
- 巧妙使用DHTML
- 获取document节点
- 获取和更新标签数据
- 设定时间处理程序
- 追加标签节点
- 本地HTML应用
- 和服务器间的通信
- 使用prototype.js的优点
- 在服务器上保存数据
- web应用的脆弱性
- 使用JavaScript的感觉
6 Ruby on Rails
6.1 MVC和Ruby on Rails
- 模型、视图和控制部分
- 用秒表的例子来学习MVC模式
- 生成视图和控制部分
- GUI工具箱与MVC
- 同时使用工具箱和MVC
- MVC的优缺点
- web应用中的MVC
6.2 开放类和猴子补丁
- 开放类
- 猴子补丁的目的
- 猴子补丁的技巧
- 灵活使用开放类的库
- 猴子补丁的几点问题
- 其他办法
- Ruby on Rails和开放类
- ActiveSupport带来的扩展
- 字节单位序列
- 复数行和序数
- 大规模开发和Ruby
- 信赖性模型
- 猴子补丁的未来
7 文字编码
7.1 文字编码的种类
- 早期的文字编码
- 纸带与文字表现
- 文字是什么
- 走向英语以外的语言(欧洲篇)
- 英语以外的语言(亚洲篇)
- Unicode的问世
- 统一编码成16位的汉字统合
- Unicode的两个问题
- Unicode的文字集
- 文字表示的不确定性
- Unicode的字符编码方式
7.2 程序中的文字处理
- 文字编码有多个意思
- 只能处理文字集中包含的文字
- 纷繁复杂的文字编码方式
- 影响力式微的Shift_JIS与EUC-JP
- Unicode有多种字符编码方式
- 为什么会发生乱码
- 字符编码方式错误
- 没有字体
- 变换位内部码时出错
- 发生不完全变换
- 文字集的不同
- 字节顺序错误
- 从编程语言的角度处理文字
- 以变换位前提的UCS方式
- 原封不动处理的CSI方式
- 使用UTF-16的Java
- 使用UTF-8的Perl
- 使用UTF-16的Python
- 采用CSI方式的Ruby 1.8
- 强化类功能的Ruby 1.9
- 是UCS还是CSI
8 正则表达式
8.1 正则表达式基础
- 检索“像那样的东西”
- 正则表达式的语法
- 3个陷阱
- 正则表达式对象
- 选项
- 正则表达式对象
- 选项
- 正则表达式匹配的方法
- 特殊变量
- 字符串与正则表达式
- split的本质
- 字符串的扫描
- 置换
8.2 正则表达式的应用实例与“鬼车”
- 解析日志文件的方法
- 避免使用$的方法
- 从邮件中选出日期的方法
- 典型拼写错误的检索方法
- Ruby 1.9的新功能“鬼车”
9 整数和浮点小数
9.1 深奥的整数世界
- 整数是有范围的
- 尝试位运算
- 操作特定的位
- 表示复数的办法
- Ruby的整数
- 挑战公开密钥方式
9.2 扑朔迷离的浮点小数世界
- 计算机对小数的处理
- 固定小数点数不易使用
- 科学计数法也有问题
- 小数不能完全表示
- 有不能比较的时候
- 误差积累
- 不是数的特别“数”
- 计算误差有多种
- 误差导致的严重问题
- BigDecimal是什么
- 能够表示分数的Rational类
10 高速执行和并行处理
10.1 让程序高速执行(前篇)
- 是不是越快越好
- 高速执行的乐趣与效率
- 以数据为基础作出判断
- 改善系统调用
- 数据可靠吗
- 只需改善瓶颈
- profiler本身成了累赘
- 算法与数据结构
- 理解 O <script type="math/tex" id="MathJax-Element-1">O</script>记法
- 选择算法
- 调查算法的性能
- 高速执行的悲哀
- 性能优化的格言
10.2 让程序高速执行(后篇)
- 确认程序概要
- 发现瓶颈
- 使用更好的profiler
- 高速优化之一:削减对象
- 高速优化之二:利用立即数
- 高速优化之三:利用C语言
- 高速优化之四:采用合适的数据结构
- 全部以C语言计算
- 还存在其他技巧
10.3 并行编程
- 使用线程的理由
- 生成线程
- 线程的执行状态
- 传递值给线程的方法
- 信息共享所产生的问题
- 数据完整性的丧失
- 死锁
- 用锁来实现对资源的独占
- 二级互斥
- 用队列协调线程
- 锁模型与队列模型的比较
10.4 前景可期的并行编程计数Actor
- 何谓Actor
- 操作Actor的3中处理系统
- Erlang的程序
- Pingpong处理的开始
- 启动pingpong程序
- Erlang的错误处理
- Erlang的使用场所
- 面向Ruby的库Revactor
- Revactor的应用场合
- 另一个库Dramatis
11 程序安全性
11.1 程序的漏洞与攻击方法
- 4中软件漏洞
- 因权限被窃取而成为重大问题
- 安全问题的根源
- “守护神”引起的问题
- 多样化的攻击手段
- 缓冲区溢出
- SQL注入
- Shell注入
- 跨站点脚本攻击
- 跨站点伪造请求
- 社会工程
11.2 用异常进行错误处理
- 异常的历史
- Java的受控异常
- Icon的面向目标判断
- Ruby的异常
- 异常发生
- 异常类
- 异常处理的设计方针
- 异常发生的设计原则
12 关于时间的处理
12.1 用程序处理时刻与时间
- 时差与时区
- 世界协调时间
- 夏令时(DST)
- 改历
- 日期与时间类
- 2038年问题
- DateTime类
- Time与DateTime的相互变换
13 关于数据的持久化
13.1 持久化数据的方法
- 保存文本
- 变换成文本的Marshal
- 使用Marshal模块
- 复制有两种方式
- 仔细看Marshal的格式
- 不能保存的3类对象
- 使用PStore
- 变换为文本的YAML
- 用YAML制作数据库
13.2 对象的保存
- 高数的Object Prevalence
- Object Prevalence的问题点
- 使用Madeleine
- 访问时刻信息
- 让Madeleine更容易使用
- Madeleine的使用例Instiki
13.3 关于XML的考察
- XML的祖先是SGML
- XML是树结构的数据表现
- 优点在于纯文本
- 缺点在于冗长
- 不适合重视效率的处理
- 适合信息交换的格式
- XML的解析
- XML处理库REXML
- XML的代替
14 函数式编程
14.1 新范型——函数式编程
- 具有多种函数式性质的Lisp
- 彻底的函数式编程语言Haskell
- 延迟计算:不必要的处理就不做
- 灵活的“静态多态性”类型系统
- 尽带函数式语言之父OCaml
- 强于并行计算的Erlang
- 用Ruby进行函数式编程
- 用枚举器来实现延迟计算
14.2 自动生成代码
- 在商业中利用的Ruby
- 使用Ruby自动生成代码
- 削除重复代码
- 代码生成的应用
- 代码生成的效果
- 编写代码生成器
- 也可以使用XML
- 在EJB中使用代码生成
14.3 内存管理与垃圾收集
- 内存管理的困难
- 垃圾收集亮相之前
- 评价垃圾收集的两个指标
- 垃圾收集算法
- 引用计数方式
- 标记和扫除方式
- 标记和紧缩方式
- 复制方式
- 多种多样的垃圾收集算法
- 分代垃圾收集
- 保守垃圾收集
- 增量垃圾收集
- 并行垃圾收集
- 位图标记
14.4 用C语言来扩展Ruby
- 开发与执行速度的取舍
- 扩展库
- 看例题学习扩展模块
- QDBM函数
- 初始化对象
- 实现方法
- 关于垃圾收集的注意事项
- 其他的Ruby API
- 扩展库的编译
- 扩展库以外的工具
14.5 为什么要开源
- 自由软件的思想
- 自由软件的历史
- Emacs事件的发生
- 开源的诞生
- OSS许可证
- 开源的背景
- 企业关注开源的理由
- Ruby与开源
- 选择许可证的方法
笔记
第4章 设计模式
4.1 设计模式(1)
4.1.2 设计模式是程序抽象化的延伸
4.1.4 SingleTon(单件)模式
- 保证
类
的实例
只有一个
4.1.5 Proxy(代理)模式
- 为某个
对象
提供代理对象
4.1.6 Iterator(迭代器)模式
提供按顺序访问集合对象中各元素的方法
- 外部迭代器:外部Iterator由客户控制每一步遍历
- 内部迭代器:内部Iterator只需要提交一个待执行的操作
4.2 设计模式(2)
4.2.2 Prototype(原型)模式
- 明确一个实例作为一个要生成对象的种类原型,通过复制该实例来生成新的对象。
- 在需要新种类对象的时候,首先复制一个既存的对象,给复制的对象直接增加方法或实例变量等功能,生成最初的第一个新种类对象。
4.2.5 Template Method(模板方法)模式
- 在父类的一个方法中定义算法框架,其中几个步骤的具体内容则留给子类来实现。
4.2.7 Observer(观察者)模式
- 当某个对象的状态发生变化时,依存于该状态的全部对象都自动得到通知,而且为了让它们都得到更新,定义了对象间一对多的依存关系。
4.3 设计模式(3)
4.3.7 Strategy(策略)模式
- 定义算法的集合,将各算法封装,使它们能够交换。
笔者按
【笔者按】说是读书笔记,整篇文章基本是目录誊写,有点对不起大家。但我还是这样做的原因,一方面所谓提纲挈领提纲挈领,这篇文章且当提纲;另一方面,兼顾整体性,不至于显得“未完待续”。松本行弘的博客还整理成了另一本书《代码的未来》,可以看作是这本书的下篇。