《松本行弘的程序世界》是探索程序設(shè)計思想和方法的經(jīng)典之作。作者從全局的角度,利用大量的程序示例及圖表,深刻闡述了Ruby編程語言的設(shè)計理念,并以獨特的視角考察了與編程相關(guān)的各種技術(shù)。閱讀《松本行弘的程序世界》不僅可以深入了解編程領(lǐng)域各個要素之間的關(guān)系,而且能夠?qū)W到大師的思考方法。 《松本行弘的程序世界》面向各層次程序設(shè)計人員和編程愛好者,也可以供相關(guān)技術(shù)人員參考。
作者簡介 松本行弘 Ruby語言的發(fā)明人,在1993年發(fā)布了Ruby語言的第一個版本,以后一直從事Ruby的設(shè)計與開發(fā)。2011年加入著名SaaS廠商 Salesforce旗下PaaS公司Heroku,任首席Ruby架構(gòu)師,致力于加快Ruby Core的開發(fā)。他還是NaCI及樂天技術(shù)研究所的研究員。著有Ruby in a Nutshell和The Ruby Programming Language 等書。他的博客地址http://www.rubyist.net/~matz/。
目錄: 第1 章 我為什么開發(fā)Ruby 1 1.1 我為什么開發(fā)Ruby 2 1.1.1 編程語言的重要性 2 1.1.2 Ruby 的原則 3 1.1.3 簡潔性 4 1.1.4 擴展性 5 1.1.5 穩(wěn)定性 6 1.1.6 一切皆因興趣 7 第2 章 面向?qū)ο蟆 ?9 2.1 編程和面向?qū)ο蟮年P(guān)系 10 2.1.1 顛倒的構(gòu)造 10 2.1.2 主宰計算機的武器 11 2.1.3 怎樣寫程序 12 2.1.4 面向?qū)ο蟮木幊谭椒ā ?2 2.1.5 面向?qū)ο蟮碾y點 13 2.1.6 多態(tài)性 13 2.1.7 具體的程序 14 2.1.8 多態(tài)性的優(yōu)點 15 2.2 數(shù)據(jù)抽象和繼承 16 2.2.1 面向?qū)ο蟮臍v史 16 2.2.2 復(fù)雜性是面向?qū)ο蟮臄橙恕 ?8 2.2.3 結(jié)構(gòu)化編程 18 2.2.4 數(shù)據(jù)抽象化 19 2.2.5 雛形 21 2.2.6 找出相似的部分來繼承 22 2.3 多重繼承的缺點 23 2.3.1 為什么需要多重繼承 23 2.3.2 多重繼承和單一繼承不可分離 24 2.3.3 goto 語句和多重繼承比較相似 25 2.3.4 解決多重繼承的問題 25 2.3.5 靜態(tài)語言和動態(tài)語言的區(qū)別 26 2.3.6 靜態(tài)語言的特點 26 2.3.7 動態(tài)語言的特點 27 2.3.8 靜態(tài)語言和動態(tài)語言的比較 27 2.3.9 繼承的兩種含義 28 2.3.10 接口的缺點 28 2.3.11 繼承實現(xiàn)的方法 29 2.3.12 從多重繼承變形而來的Mix-in 29 2.3.13 積極支持Mix-in 的Ruby 30 2.4 兩個誤解 31 2.4.1 面向?qū)ο蟮木幊獭 ?1 2.4.2 對象的模板 = 類 33 2.4.3 利用模塊的手段=繼承 33 2.4.4 多重繼承不好嗎 34 2.4.5 動態(tài)編程語言也需要多重繼承 35 2.4.6 馴服多重繼承的方法 35 2.4.7 Ruby 中多重繼承的實現(xiàn)方法 37 2.4.8 Java 實現(xiàn)多重繼承的方法 38 2.5 Duck Typing 誕生之前 39 2.5.1 為什么需要類型 39 2.5.2 動態(tài)的類型是從Lisp 中誕生的 40 2.5.3 動態(tài)類型在面向?qū)ο笾邪l(fā)展起來了 41 2.5.4 動態(tài)類型和靜態(tài)類型的邂逅 42 2.5.5 靜態(tài)類型的優(yōu)點 42 2.5.6 動態(tài)類型的優(yōu)點 43 2.5.7 只關(guān)心行為的Duck Typing 44 2.5.8 避免明確的類型檢查 45 2.5.9 克服動態(tài)類型的缺點 46 2.5.10 動態(tài)編程語言 46 2.6 元編程 46 2.6.1 元編程 46 2.6.2 反射 47 2.6.3 元編程的例子 48 2.6.4 使用反射功能 48 2.6.5 分布式Ruby 的實現(xiàn) 49 2.6.6 數(shù)據(jù)庫的應(yīng)用 50 2.6.7 輸出XML 51 2.6.8 元編程和小編程語言 51 2.6.9 聲明的實現(xiàn) 52 2.6.10 上下文相關(guān)的實現(xiàn) 52 2.6.11 單位的實現(xiàn) 53 2.6.12 詞匯的實現(xiàn) 53 2.6.13 層次數(shù)據(jù)的實現(xiàn) 54 2.6.14 適合DSL 的語言,不適合DSL 的語言 54 第3 章 程序塊 57 3.1 程序塊的威力 58 3.1.1 把函數(shù)作為參數(shù)的高階函數(shù) 58 3.1.2 C 語言高階函數(shù)的局限 59 3.1.3 可以保存外部環(huán)境的閉包 60 3.1.4 塊的兩種使用方法 60 3.1.5 最終來看,塊到底是什么 61 3.1.6 塊在循環(huán)處理中的應(yīng)用 62 3.1.7 內(nèi)部迭代器和外部迭代器 62 3.1.8 在排序和比較大小中的應(yīng)用 63 3.1.9 用塊保證程序的后處理 63 3.1.10 用塊實現(xiàn)新的控制結(jié)構(gòu) 64 3.1.11 在回調(diào)中使用塊 65 3.1.12 塊處理的特別理由 65 3.2 用塊作循環(huán) 66 3.2. 1 塊是處理的集合 67 3.2.2 塊應(yīng)用范圍的擴展 68 3.2.3 高階函數(shù)和塊的本質(zhì)一樣 69 3.2.4 用Enumerable 來利用塊 69 3.2.5 Enumerable 的局限 74 3.3 精通集合的使用 77 3.3.1 使用Ruby 的數(shù)組 77 3.3.2 修改指定范圍的元素內(nèi)容 78 3.3.3 Ruby 中的哈希處理 78 3.3.4 支持循環(huán)的Enumerable 79 3.3.5 用于循環(huán)的each 方法 81 3.3.6 使用inject、zip 和grep 81 3.3.7 用來指定條件的select 方法 82 3.3.8 排序與比較大小的方法 83 3.3.9 在類中包含(include)Enumerable 模塊 84 3.3.10 List 的內(nèi)部包和塊的區(qū)別 85 第4 章 設(shè)計模式 89 4.1 設(shè)計模式(1) 90 4.1.1 設(shè)計模式的價值和意義 91 4.1.2 設(shè)計模式是程序抽象化的延伸 92 4.1.3 Ruby 中的設(shè)計模式 92 4.1.4 Singleton 模式 92 4.1.5 Proxy 模式 94 4.1.6 Iterator 模式 95 4.1.7 外部與內(nèi)部,哪一個更好 96 4.1.8 內(nèi)部迭代器的缺陷 97 4.1.9 外部迭代器的缺陷 98 4.2 設(shè)計模式(2) 98 4.2.1 模式與動態(tài)語言的關(guān)系 99 4.2.2 重復(fù)使用既存對象的Prototype模式 99 4.2.3 親身體驗Io 語言 100 4.2.4 Ruby 中的原型 101 4.2.5 編寫抽象算法的Template Method模式 101 4.2.6 用Ruby 來嘗試TemplateMethod 102 4.2.7 動態(tài)語言與Template Method模式 104 4.2.8 避免高度依賴性的Observer模式 104 4.2.9 Observable 模塊 105 4.2.10 Observer 模式與動態(tài)語言 107 4.3 設(shè)計模式(3) 107 4.3.1 軟件開發(fā)的悲劇 108 4.3.2 開放— 封閉原則 108 4.3.3 面向?qū)ο蟮那闆r 109 4.3.4 非面向?qū)ο蟮那闆r 110 4.3.5 OCP 與Template Method 模式 111 4.3.6 Observer 模式 113 4.3.7 使用Strategy 模式 114 4.3.8 Strategy 模式與OCP 116 第5 章 Ajax 119 5.1 Ajax 和java script(前篇) 120 5.1.1 通信及異步頁面更新 120 5.1.2 技術(shù)要素之一:java script 122 5.1.3 技術(shù)要素之二:XML 122 5.1.4 XML 以外的數(shù)據(jù)表現(xiàn)形式 123 5.1.5 技術(shù)要素之三:DHTML 124 5.1.6 java script 技術(shù)基礎(chǔ) 124 5.1.7 原型模式的面向?qū)ο缶幊陶Z言 126 5.1.8 使用prototype.js 庫 127 5.1.9 prototype.js 的功能 127 5.2 Ajax 和java script(后篇) 130 5.2.1 巧妙使用DHTML 131 5.2.2 獲取document 節(jié)點 132 5.2.3 獲取和更新標簽數(shù)據(jù) 133 5.2.4 設(shè)定事件處理程序 133 5.2.5 追加標簽節(jié)點 135 5.2.6 本地HTML 應(yīng)用 135 5.2.7 和服務(wù)器間的通信 137 5.2.8 使用Prototype.js 的優(yōu)點 138 5.2.9 在服務(wù)器上保存數(shù)據(jù) 138 5.2.10 Web 應(yīng)用的脆弱性 140 5.2.11 使用java script 的感覺 141 第6 章 Ruby on Rails 143 6.1 MVC 和Ruby on Rails 144 6.1.1 模型、視圖和控制的作用 144 6.1.2 用秒表的例子來學(xué)習(xí)MVC模式 145 6.1.3 生成視圖和控制部分 147 6.1.4 GUI 工具箱與MVC 148 6.1.5 同時使用工具箱和MVC 149 6.1.6 MVC 的優(yōu)缺點 151 6.1.7 Web 應(yīng)用中的MVC 152 6.2 開放類和猴子補丁 153 6.2.1 開放類 154 6.2.2 猴子補丁的目的 154 6.2.3 猴子補丁的技巧 155 6.2.4 靈活使用開放類的庫 159 6.2.5 猴子補丁的幾點問題 161 6.2.6 其他辦法 162 6.2.7 Ruby on Rails 和開放類 165 6.2.8 ActiveSupport 帶來的擴展 166 6.2.9 字節(jié)單位系列 168 6.2.10 復(fù)數(shù)形和序數(shù) 168 6.2.11 大規(guī)模開發(fā)和Ruby 169 6.2.12 信賴性模型 170 6.2.13 猴子補丁的未來 170 第7 章 文字編碼 173 7.1 文字編碼的種類 174 7.1.1 早期的文字編碼 174 7.1.2 紙帶與文字表現(xiàn) 175 7.1.3 文字是什么 176 7.1.4 走向英語以外的語言(歐洲篇) 177 7.1.5 英語以外的語言(亞洲篇) 177 7.1.6 Unicode 的問世 180 7.1.7 統(tǒng)一編碼成16 位的漢字統(tǒng)合 181 7.1.8 Unicode 的兩個問題 181 7.1.9 Unicode 的文字集 182 7.1.10 文字表示的不確定性 183 7.1.11 Unicode 的字符編碼方式 183 7.2 程序中的文字處理 185 7.2.1 文字編碼有多個意思 185 7.2.2 只能處理文字集中包含的文字 185 7.2.3 紛繁復(fù)雜的文字編碼方式 186 7.2.4 影響力漸微的Shift_JIS 與EUC-JP 186 7.2.5 Unicode 有多種字符編碼方式 186 7.2.6 為什么會發(fā)生亂碼 188 7.2.7 字符編碼方式錯誤 188 7.2.8 沒有字體 189 7.2.9 變換為內(nèi)部碼時出錯 189 7.2.10 發(fā)生不完全變換 189 7.2.11 文字集的不同 190 7.2.12 字節(jié)順序錯誤 191 7.2.13 從編程語言的角度處理文字 191 7.2.14 以變換為前提的UCS 方式 191 7.2.15 原封不動處理的CSI 方式 192 7.2.16 使用UTF-16 的Java 192 7.2.17 使用UTF-8 的Perl 193 7.2.18 用UTF-16 的Python 194 7.2.19 采用CSI 方式的Ruby 1.8 194 7.2.20 強化了功能的Ruby 1.9 195 7.2.21 是UCS 還是CSI 196 第8 章 正則表達式 199 8.1 正則表達式基礎(chǔ) 200 8.1.1 檢索“像那樣的東西” 200 8.1.2 正則表達式的語法 200 8.1.3 3 個陷阱 203 8.1.4 正則表達式對象 204 8.1.5 選項 205 8.1.6 正則表達式匹配的方法 206 8.1.7 特殊變量 207 8.1.8 字符串與正則表達式 207 8.1.9 split 的本質(zhì) 207 8.1.10 字符串的掃描 208 8.1.11 置換 208 8.2 正則表達式的應(yīng)用實例與“鬼車” 210 8.2.1 解析日志文件的方法 211 8.2.2 避免使用$的方法 213 8.2.3 從郵件中取出日期的方法 215 8.2.4 典型拼寫錯誤的檢索方法 216 8.2.5 Ruby 1.9 的新功能“鬼車” 216 第9 章 整數(shù)和浮點小數(shù) 219 9.1 深奧的整數(shù)世界 220 9.1.1 整數(shù)是有范圍的 221 9.1.2 嘗試位運算 222 9.1.3 操作特定的位 223 9.1.4 表示負數(shù)的辦法 225 9.1.5 Ruby 的整數(shù) 226 9.1.6 挑戰(zhàn)公開密鑰方式 227 9.2 撲朔迷離的浮點小數(shù)世界 228 9.2.1 計算機對小數(shù)的處理 229 9.2.2 固定小數(shù)點數(shù)不易使用 229 9.2.3 科學(xué)計數(shù)法也有問題 229 9.2.4 小數(shù)不能完全表示 230 9.2.5 有不能比較的時候 231 9.2.6 誤差積累 232 9.2.7 不是數(shù)的特別“數(shù)” 232 9.2.8 計算誤差有多種 233 9.2.9 誤差導(dǎo)致的嚴重問題 235 9.2.10 BigDecimal 是什么 236 9.2.11 能夠表示分數(shù)的Rational類 236 第10 章 高速執(zhí)行和并行處理 239 10.1 讓程序高速執(zhí)行(前篇) 240 10.1.1 是不是越快越好 240 10.1.2 高速執(zhí)行的樂趣與效率 240 10.1.3 以數(shù)據(jù)為基礎(chǔ)作出判斷 241 10.1.4 改善系統(tǒng)調(diào)用 241 10.1.5 數(shù)據(jù)可靠嗎 243 10.1.6 只需改善瓶頸 243 10.1.7 profiler 本身成了累贅 245 10.1.8 算法與數(shù)據(jù)結(jié)構(gòu) 245 10.1.9 理解O 記法 245 10.1.10 選擇算法 246 10.1.11 調(diào)查算法的性能 246 10.1.12 高速執(zhí)行的悲哀 247 10.1.13 性能優(yōu)化的格言 248 10.2 讓程序高速執(zhí)行(后篇) 248 10.2.1 確認程序概要 249 10.2.2 發(fā)現(xiàn)瓶頸 250 10.2.3 使用更好的profiler 251 10.2.4 高速優(yōu)化之一:削減對象 252 10.2.5 高速優(yōu)化之二:利用立即值 254 10.2.6 高速優(yōu)化之三:利用C 語言 255 10.2.7 高速優(yōu)化之四:采用合適的數(shù)據(jù)結(jié)構(gòu) 256 10.2.8 全部以C 語言計算 257 10.2.9 還存在其他技巧 257 10.3 并行編程 258 10.3.1 使用線程的理由 258 10.3.2 生成線程 259 10.3.3 線程的執(zhí)行狀態(tài) 260 10.3.4 傳遞值給線程的方法 261 10.3.5 信息共有所產(chǎn)生的問題 262 10.3.6 數(shù)據(jù)完整性的喪失 262 10.3.7 死鎖 263 10.3.8 用鎖來實現(xiàn)對資源的獨占 264 10.3.9 二級互斥 265 10.3.10 用隊列協(xié)調(diào)線程 265 10.3.11 鎖模型與隊列模型的比較 267 10.4 前景可期的并行編程技術(shù),Actor 268 10.4.1 何謂Actor 268 10.4.2 操作Actor 的3 種處理系統(tǒng) 269 10.4.3 Erlang 的程序 270 10.4.4 Pingpong 處理的開始 270 10.4.5 啟動pingpong 程序 271 10.4.6 Erlang 的錯誤處理 272 10.4.7 Erlang 的使用場所 273 10.4.8 面向Ruby 的庫“Revactor” 273 10.4.9 Revactor 的應(yīng)用場合 274 10.4.10 另一個庫Dramatis 275 第11 章 程序安全性 279 11.1 程序的漏洞與攻擊方法 280 11.1.1 4 種軟件漏洞 280 11.1.2 因權(quán)限被竊取而成為重大問題 281 11.1.3 安全問題的根源 281 11.1.4 “守護神”引起的問題 282 11.1.5 多 樣化的攻擊手段 282 11.1.6 緩沖區(qū)溢出 283 11.1.7 整數(shù)溢出 284 11.1.8 SQL 注入 285 11.1.9 Shell 注入 286 11.1.10 跨站點腳本攻擊 287 11.1.11 跨站點偽造請求 288 11.1.12 社會工程 289 11.2 用異常進行錯誤處理 290 11.2.1 異常的歷史 292 11.2.2 Java 的受控異! 292 11.2.3 Icon 的面向目標判斷 293 11.2.4 Ruby 的異常 294 11.2.5 異常發(fā)生 295 11.2.6 異常類 296 11.2.7 異常處理的設(shè)計方針 297 11.2.8 異常發(fā)生的設(shè)計原則 298 第12 章 關(guān)于時間的處理 301 12.1 用程序處理時刻與時間 302 12.1.1 時差與時區(qū) 302 12.1.2 世界協(xié)調(diào)時間 302 12.1.3 夏令時(DST) 303 12.1.4 改歷 304 12.1.5 日期與時間的類 305 12.1.6 2038 年問題 308 12.1.7 DateTime 類 309 12.1.8 Time 與DateTime 的相互變換 310 第13 章 關(guān)于數(shù)據(jù)的持久化 313 13.1 持久化數(shù)據(jù)的方法 314 13.1.1 保存文本 314 13.1.2 變換成文本的Marshal 314 13.1.3 使用Marshal 模塊 315 13.1.4 復(fù)制有兩種方式 316 13.1.5 仔細看Marshal 的格式 316 13.1.6 不能保存的3 類對象 317 13.1.7 制作面向?qū)ο髷?shù)據(jù)庫 318 13.1.8 試用PStore 318 13.1.9 變換為文本的YAML 320 13.1.10 用YAML 制作數(shù)據(jù)庫 321 13.2 對象的保存 322 13.2.1 高速的Object Preva lence 322 13.2.2 Object Preva lence 的問題點 323 13.2.3 使用Madeleine 323 13.2.4 訪問時刻信息 325 13.2.5 讓Madeleine 更容易使用 326 13.2.6 Madeleine 的實用例Instiki 328 13.3 關(guān)于XML 的考察 328 13.3.1 XML 的祖先是SGML 329 13.3.2 XML 是樹結(jié)構(gòu)的數(shù)據(jù)表現(xiàn) 329 13.3.3 優(yōu)點在于純文本 330 13.3.4 缺點在于冗長 331 13.3.5 不適合重視效率的處理 331 13.3.6 適合于信息交換的格式 332 13.3.7 XML 的解析 332 13.3.8 XML 處理庫REXML 333 13.3.9 XML 的代替 336 第14 章 函數(shù)式編程 339 14.1 新范型——函數(shù)式編程 340 14.1.1 具有多種函數(shù)式性質(zhì)的Lisp 341 14.1.2 徹底的函數(shù)式編程語言Haskell 342 14.1.3 延遲計算:不必要的處理就不做 343 14.1.4 靈活的“靜態(tài)多態(tài)性”類型系統(tǒng) 344 14.1.5 近代函數(shù)式語言之父OCaml 345 14.1.6 強于并行計算的Erlang 345 14.1.7 用Ruby 進行函數(shù)式編程 346 14.1.8 用枚舉器來實現(xiàn)延遲計算 347 14.2 自動生成代碼 348 14.2.1 在商業(yè)中利用Ruby 349 14.2.2 使用Ruby 自動生成代碼 350 14.2.3 消除重復(fù)代碼 350 14.2.4 代碼生成的應(yīng)用 351 14.2.5 代碼生成的效果 352 14.2.6 編寫代碼生成器 353 14.2.7 也可以使用XML 354 14.2.8 在EJB 中使用代碼生成 355 14.3 內(nèi) 存管理與垃圾收集 356 14.3.1 內(nèi)存管理的困難 357 14.3.2 垃圾收集亮相之前 358 14.3.3 評價垃圾收集的兩個指標 359 14.3.4 垃圾收集算法 360 14.3.5 引用計數(shù)方式 360 14.3.6 標記和掃除方式 361 14.3.7 標記和緊縮方式 362 14.3.8 復(fù)制方式 363 14.3.9 多種多樣的垃圾收集算法 364 14.3.10 分代垃圾收集 364 14.3.11 保守垃圾收集 366 14.3.12 增量垃圾收集 366 14.3.13 并行垃圾收集 367 14.3.14 位圖標記 367 14.4 用C 語言來擴展Ruby 368 14.4.1 開發(fā)與執(zhí)行速度的取舍 368 14.4.2 擴展庫 369 14.4.3 看例題學(xué)習(xí)擴展模塊 370 14.4.4 QDBM 函數(shù) 372 14.4.5 初始化對象 373 14.4.6 實現(xiàn)方法 374 14.4.7 關(guān)于垃圾收集的注意事項 376 14.4.8 其他的Ruby API 376 14.4.9 擴展庫的編譯 376 14.4.10 擴展庫以外的工具 377 14.5 為什么要開源 380 14.5.1 自由軟件的思想 380 14.5.2 自由軟件的歷史 381 14.5.3 Emacs 事件的發(fā)生 381 14.5.4 開源的誕生 382 14.5.5 OSS 許可證 383 14.5.6 開源的背景 385 14.5.7 企業(yè)關(guān)注開源的理由 386 14.5.8 Ruby 與開源 386 14.5.9 選擇許可證的方法 387
|