【设计】松本行弘的程序世界

[日] 松本行弘 ◎著 《松本行弘的程序世界》

本书是作者在月刊杂志《日经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(策略)模式
  • 定义算法的集合,将各算法封装,使它们能够交换。

笔者按

【笔者按】说是读书笔记,整篇文章基本是目录誊写,有点对不起大家。但我还是这样做的原因,一方面所谓提纲挈领提纲挈领,这篇文章且当提纲;另一方面,兼顾整体性,不至于显得“未完待续”。松本行弘的博客还整理成了另一本书《代码的未来》,可以看作是这本书的下篇。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值