【設計】松本行弘的程序世界

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

本書是作者在月刊雜誌《日經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(策略)模式

  • 定義算法的集合,將各算法封裝,使它們能夠交換。

筆者按

【筆者按】說是讀書筆記,整篇文章基本是目錄謄寫,有點對不起大家。但我還是這樣做的原因,一方面所謂提綱挈領提綱挈領,這篇文章且當提綱;另一方面,兼顧整體性,不至於顯得“未完待續”。松本行弘的博客還整理成了另一本書《代碼的未來》,可以看作是這本書的下篇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章