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

原创 2016年12月26日 11:16:10

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

本书是作者在月刊杂志《日经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记法
  • 选择算法
  • 调查算法的性能
  • 高速执行的悲哀
  • 性能优化的格言

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(策略)模式

  • 定义算法的集合,将各算法封装,使它们能够交换。

笔者按

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

版权声明:本文为博主原创文章,转载时请注明原网址。

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Ruby中的设计模式——《松本行弘的程序世界》

MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0    《设计模式》一书是用C++和Smalltalk介绍模式实例的。看了那些例子,...

读《松本行弘的程序世界》

边读边记录,文章会很长,所以一次没办法写完面向对象: 该如何考虑在2.3.8提到的:只有包含继承关系的类才会具有多态性? 在编程时往往要求到的扩展性,实现扩展性的一个重要方法是抽象...
  • HEL_WOR
  • HEL_WOR
  • 2016年02月29日 20:38
  • 550

《松本行弘的程序世界》读书笔记

半个月之前买了这本书,还是经园子里的一位网友推荐的。到现在看了一半多,基础的都看完了,剩下的几章可做高级部分来看。这本书看到现在,可以说感触很深,必须做一次读书笔记! 关于这本书,不了解的可以去网上...

松本行弘的程序世界

  • 2016年04月02日 19:32
  • 32.3MB
  • 下载

【读书笔记】松本行弘的程序世界

为什么开发Ruby 编程语言与效率关系太紧密。 Ruby的设计原则 简洁性:内存管理,变量和表达式的类型检查都可以在执行时自动进行 扩展性 稳定性 面向对象 面向对象与编程的关系 程序员不要沦为计算机...

《松本行弘的程序世界》中文版原作者序

  从年轻的时候开始,我就一直对编程语言有着极为浓厚的兴趣。比起“使用计算机去干什么?”这一问题,我总是一门心思在想着“如何将自己的意图传达给计算机?”。从这个意义上说,我认为自己是个“怪人”。但是,...

《松本行弘的程序世界》精彩书摘

《松本行弘的程序世界》精彩书摘 Posted on September 6, 2011 by lowerthan60 以下是2011年4月份在复审《松本行弘的程序世界》期间,随手摘录发...

多重继承不好的观点是错误的 — 小评<松本行弘的程序世界>

首先得说, 一般某种语言的发明人写的关于自己语言的东西都是非常值得阅读的, 从别的牛人那里你也许能学会很多奇技淫巧, 但从语言发明人那里你能学到语言发明人本身设计的初衷, 以及设计时的一些抉择. 这种...
  • vagrxie
  • vagrxie
  • 2013年01月08日 01:35
  • 16858

松本行弘的程序世界(二)

编程和面向对象的关系 颠倒的构造 1.      有一个有趣的例子,叫做“阿尔法法则”。机器是人的奴隶,还是人沦为机器的奴隶。这个我有不同于作者的观点。人机是交互的,或者说是对等的。人和计算机打交...
  • viekie
  • viekie
  • 2012年04月18日 20:18
  • 655
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【设计】松本行弘的程序世界
举报原因:
原因补充:

(最多只允许输入30个字)