[日] 松本行弘 ◎著 《松本行弘的程序世界》
本書是作者在月刊雜誌《日經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(策略)模式
- 定義算法的集合,將各算法封裝,使它們能夠交換。
筆者按
【筆者按】說是讀書筆記,整篇文章基本是目錄謄寫,有點對不起大家。但我還是這樣做的原因,一方面所謂提綱挈領提綱挈領,這篇文章且當提綱;另一方面,兼顧整體性,不至於顯得“未完待續”。松本行弘的博客還整理成了另一本書《代碼的未來》,可以看作是這本書的下篇。