編輯推薦
適讀人群 :Ruby程序員、動態語言愛好者 這是一本關於模式的書。這些模式和史蒂夫?邁剋康奈爾在《代碼大全》中所說的code construction相對應。用Kent Beck 的話說,它們都是實現模式。這也就意味著,它們與《設計模式》《企業級架構模式》中的模式不同,本書的這些模式大多數是輕量級的。它們並不高深,主要用於編寫單個方法。比起那些重量級的模式,這些模式更像是編程慣用法或編程風格指南。
本書的宗旨是幫助讀者寫齣一目瞭然的方法。
內容簡介
本書總結瞭32條Ruby編程技巧,幫助讀者寫齣清晰、優雅、穩定的Ruby代碼。作者Avdi Grimm主張Ruby方法應該像故事一樣易於閱讀。他將Ruby方法分成輸入處理(Collecting Input)、功能實現(Performing Work)、輸齣處理(Delivering Output)、失敗處理(Handling Failures)四個部分,針對每個部分的特點歸納實用的編程模式,並配閤豐富的實例講解,讓讀者寫齣優雅實用的Ruby代碼,找迴Ruby編程的樂趣。
作者簡介
Avdi Grimm是ShipRise.com和RubyTapas.com的創始人,有著十幾年Ruby編程經驗,是Ruby程序界的領軍人物。他目前與妻子居住在美國賓夕法尼亞南部。
精彩書評
《優雅的Ruby》讓復雜的代碼變得容易編寫瞭。
——Kevin Sj?berg
如果你想找迴Ruby編程的樂趣,這是zui棒的一本書。
——Matt Rogers
我寫瞭30年代碼,《優雅的Ruby》仍然讓我受益匪淺。
——Jeff Dickey
學到很多重構代碼的技巧。
——月亮便士,豆瓣網友
目錄
第1章 引言 1
1.1 當Ruby遭遇現實 2
1.2 自信優雅的代碼 2
1.3 好的故事,糟糕的講述 3
1.4 像寫故事一樣寫代碼 4
1.5 方法的四個部分 4
1.6 本書組織結構 8
第2章 功能實現 11
2.1 發送有效的消息 12
2.2 導入交易記錄 13
2.3 識彆消息 14
2.4 識彆角色 14
2.5 避免馬蓋先主義 17
2.6 讓語言為係統服務 17
2.7 像鴨子一樣叫 18
2.8 馴養鴨群 19
第3章 收集輸入 21
3.1 輸入處理概述 21
3.1.1 間接輸入 23
3.1.2 從角色到對象 26
3.1.3 保護邊界而非內部 27
3.2 使用內置的類型轉換協議 28
3.2.1 適用場景 28
3.2.2 摘要 28
3.2.3 基本原理 28
3.2.4 示例:宣布獲奬結果 28
3.2.5 示例:Emacs配置文件 30
3.2.6 標準類型轉換方法列錶 32
3.2.7 顯式轉換和隱式轉換 33
3.2.8 明確提齣參數要求 37
3.2.9 小結 39
3.3 有條件地使用類型轉換方法 40
3.3.1 使用場景 40
3.3.2 摘要 40
3.3.3 基本原理 40
3.3.4 示例:打開文件 40
3.3.5 違反鴨子類型的唯一特例 42
3.3.6 小結 45
3.4 自定義類型轉換協議 46
3.4.1 使用場景 46
3.4.2 摘要 46
3.4.3 基本原理 46
3.4.4 示例:接收一個點或一對坐標 46
3.4.5 小結 48
3.5 定義自定義類型的轉換協議 49
3.5.1 使用場景 49
3.5.2 摘要 49
3.5.3 基本原理 49
3.5.4 示例:將英尺轉換為米 49
3.5.5 小結 52
3.6 利用內置強製類型轉換方法 53
3.6.1 使用場景 53
3.6.2 摘要 53
3.6.3 基本原理 53
3.6.4 示例:格式化打印數字 53
3.6.5 Hash.[] 57
3.6.6 小結 57
3.7 用Array()將輸入數組化 58
3.7.1 使用場景 58
3.7.2 摘要 58
3.7.3 基本原理 58
3.7.4 示例:可變參數 58
3.7.5 小結 60
3.8 自定義強製類型轉換方法 61
3.8.1 使用場景 61
3.8.2 摘要 61
3.8.3 基本原理 61
3.8.4 示例:應用於2D圖形中的強製類型轉換方法 62
3.8.5 關於module_function 63
3.8.6 結閤類型轉換協議和強製類型轉換方法 64
3.8.7 用Lambdas錶達式作case分支 66
3.8.8 小結 67
3.9 用自定義類替換類字符串類型 68
3.9.1 使用場景 68
3.9.2 摘要 68
3.9.3 基本原理 68
3.9.4 示例:紅綠燈的狀態問題 69
3.9.5 小結 77
3.10 用適配器裝飾輸入 78
3.10.1 使用場景 78
3.10.2 摘要 78
3.10.3 基本原理 78
3.10.4 示例:將日誌寫進IRC 78
3.10.5 小結 82
3.11 利用透明適配器逐步消除類型依賴 83
3.11.1 適用場景 83
3.11.2 摘要 83
3.11.3 基本原理 83
3.11.4 示例:再探將日誌寫進IRC的示例 83
3.11.5 小結 86
3.12 利用先決條件排除非法輸入 87
3.12.1 使用場景 87
3.12.2 摘要 87
3.12.3 基本原理 87
3.12.4 示例:員工入職日期 87
3.12.5 “可執行文檔” 91
3.12.6 小結 91
3.13 利用#fetch確保Hash鍵的存在性 92
3.13.1 使用場景 92
3.13.2 摘要 92
3.13.3 基本原理 92
3.13.4 示例:useradd(8)包裝器 92
3.13.5 嘗試#fetch 95
3.13.6 自定義#fetch 98
3.13.7 小結 99
3.14 利用#fetch提供默認參數 100
3.14.1 使用場景 100
3.14.2 摘要 100
3.14.3 基本原理 100
3.14.4 示例:可選的logger參數 100
3.14.5 可重用的#fetch代碼塊 104
3.14.6 雙參數#fetch 106
3.14.7 小結 107
3.15 用斷言驗證假設 108
3.15.1 使用場景 108
3.15.2 摘要 108
3.15.3 基本原理 108
3.15.4 示例:導入銀行記錄 108
3.15.5 小結 113
3.16 用衛語句來處理特殊場景 114
3.16.1 使用場景 114
3.16.2 摘要 114
3.16.3 基本原理 114
3.16.4 示例:“靜音模式”標誌 114
3.16.5 提前返迴 116
3.16.6 小結 117
3.17 用對象錶示特殊場景 118
3.17.1 使用場景 118
3.17.2 摘要 118
3.17.3 基本原理 118
3.17.4 示例:遊客用戶 118
3.17.5 用特例對象來錶示當前用戶 121
3.17.6 小步改進 126
3.17.7 保持特例對象和普通對象的同步 128
3.17.8 小結 129
3.18 用空對象錶示不做事的情況 130
3.18.1 使用場景 130
3.18.2 摘要 130
3.18.3 基本原理 130
3.18.4 示例:輸齣日誌到shell命令行 131
3.18.5 通用空對象 133
3.18.6 穿越事界 134
3.18.7 讓空對象返迴false 138
3.18.8 小結 140
3.19 用良性值替代nil 142
3.19.1 使用場景 142
3.19.2 摘要 142
3.19.3 基本原理 142
3.19.4 示例:顯示會員地理位置信息 142
3.19.5 無害就好 145
3.19.6 小結 146
3.20 用symbols做占位符 147
3.20.1 使用場景 147
3.20.2 摘要 147
3.20.3 基本原理 147
3.20.4 示例:web service可選認證 147
3.20.5 都是nil惹的禍 149
3.20.6 帶語義的占位符 152
3.20.7 小結 154
3.21 將參數封裝到參數對象中 155
3.21.1 使用場景 155
3.21.2 摘要 155
3.21.3 基本原理 155
3.21.4 參數對象迴顧 155
3.21.5 添加可選參數 159
3.21.6 小結 163
3.22 提取參數構建器 164
3.22.1 使用場景 164
3.22.2 摘要 164
3.22.3 基本原理 164
3.22.4 示例:方便的繪點API 164
3.22.5 Net/HTTP vs. Faraday 168
3.22.6 提取參數Builder 170
3.22.7 小結 172
第4章 輸齣處理 173
4.1 用全函數作為方法返迴值 174
4.1.1 使用場景 174
4.1.2 摘要 174
4.1.3 基本原理 174
4.1.4 示例:單詞搜索 174
4.1.5 小結 178
4.2 執行迴調而非返迴狀態 179
4.2.1 使用場景 179
4.2.2 摘要 179
4.2.3 基本原理 179
4.2.4 示例 179
4.2.5 小結 182
4.3 用良性值錶示失敗 183
4.3.1 使用場景 183
4.3.2 摘要 183
4.3.3 基本原理 183
4.3.4 示例:在側邊欄上顯示推文 183
4.3.5 小結 185
4.4 用特例對象錶示失敗 186
4.4.1 使用場景 186
4.4.2 摘要 186
4.4.3 基本原理 186
4.4.4 示例:遊客用戶 186
4.4.5 小結 187
4.5 返迴狀態對象 188
4.5.1 使用場景 188
4.5.2 摘要 188
4.5.3 基本原理 188
4.5.4 示例:記錄導入結果 188
4.5.5 小結 192
4.6 將狀態對象傳給迴調 193
4.6.1 使用場景 193
4.6.2 摘要 193
4.6.3 基本原理 193
4.6.4 示例:將導入結果傳給迴調 193
4.6.5 測試狀態對象 198
4.6.6 小結 199
4.7 用throw提前終止執行 200
4.7.1 使用場景 200
4.7.2 摘要 200
4.7.3 示例:提前終止HTML文檔解析 200
4.7.4 小結 205
第5章 失敗處理 207
5.1 優先使用頂層異常捕獲 208
5.1.1 使用場景 208
5.1.2 摘要 208
5.1.3 基本原理 208
5.1.4 示例 208
5.1.5 小結 209
5.2 用受檢方法封裝危險操作 210
5.2.1 使用場景 210
5.2.2 摘要 210
5.2.3 基本原理 210
5.2.4 示例 210
5.2.5 演進成Adapters 212
5.2.6 小結 212
5.3 使用護衛方法 213
5.3.1 使用場景 213
5.3.2 摘要 213
5.3.3 基本原理 213
5.3.4 示例:子進程狀態檢測 213
5.3.5 小結 216
第6章 為瞭優雅重構 217
6.1 MetricFu 218
6.1.1 Location 218
6.1.2 HotspotAnalyzedProblems 222
6.1.3 排名 225
6.2 Stringer 227
第7章 後記 231
精彩書摘
全書可以分成六個部分。
首先討論用消息和角色的思想來實現方法。
第2章討論“實現功能”。雖然這看起來不符閤前文提到的“方法組成順序”,但是通過這一章的學習,你將學會思考如何設計方法,以便為後麵的模式學習打下基礎。
第3章到第5章是本書最核心的模式部分,每個模式又由五個部分組成:
1. 適用場景。就像藥品包裝上寫有適用癥狀,這部分內容簡要地介紹瞭模式的適用場景,比如用來解決特定問題,或者修正編寫代碼的不良習慣。
2. 摘要。當你嘗試迴憶某個模式,但又不記得名字時,摘要能夠給你莫大的幫助。
3. 基本原理,闡述為何要用這個模式。
4. 示例。藉助一兩個具體的例子闡述選擇該模式的原因及實現方法。
5. 小結。總結模式的優點、潛在的陷阱和不足。
根據我提齣的組成方法的原則,這些模式被分為以下三大係列。
? 輸入處理的模式。
? 輸齣處理的模式,讓方法調用者優雅地調用方法。
異常處理模式,保障方法井然有序。
第6章將討論一些實際的Ruby開源項目示例,並把本書中的模式應用到它們身上。
3.times { rejoice! }
總之,學習這套模式可以讓你寫齣優雅的代碼:易於理解和維護、更少的bug、更靈活地適應需求變化。
除瞭幫助讀者掌握寫齣優雅代碼的技巧,我更希望幫助讀者重拾初學Ruby的那份快樂,找迴寫代碼寫到不經意微笑的狀態,養成快樂編程的習慣。這些收獲可以讓你為獲得更大的快樂而嘗試更大的項目,這種快樂就如同初識Ruby時的興奮一樣。
前言/序言
在2011年新奧爾良的RubyConf上,我認識瞭Avdi。我並無過人之處,不過是一個無名小輩,趕鴨子上架,做瞭一兩個演講而已。Jim Weirich 聽瞭其中一個演講,當即招手叫來Avdi,把我介紹給他。我們三人跳過部分演講,在會場外聊得非常開心。這次聊天不但開闊瞭見聞,而且改變瞭我們的生活。 我們三個當時是那麼激動,以至於我都好奇為啥沒人叫我們“閉嘴”,也沒被休息室的負責人“請齣去”。
時至今日,迴想起那段時光,我們的談話仍縈繞耳邊,仿佛依然能感受到Jim那極具感染力的熱情和Avdi的誠摯。我都不敢相信這一切是真的,不相信我有那麼幸運。我仿佛已羽化登仙——登上瞭那片隻屬於程序員的仙境。
我坦言在寫一本名為《Practical Object-Oriented Design in Ruby》的書,Avdi很有風度地錶示願意試讀。說是“試讀”,他實際上費瞭很多心血和精力校對。他不僅給齣建議,還逐行看Ruby代碼,糾正錯誤、提升代碼質量。當我感謝他時,他雖很高興,但總是謙虛地說沒做什麼。就這點而言,我有相當的發言權,可以負責任地告訴你,他非常友好和有耐心。
因此,我很榮幸推薦這本《優雅的Ruby》。Avdi的思想貫穿全書。他關於方法如何組織的觀點為我們思考代碼提供瞭新的視角,他的“秘籍”為我們編寫代碼提供瞭最直接、最通俗易懂的指導。
他有一種天賦,能將嚴謹的技術理念用獨特而輕鬆的方式講齣來。在本書中,有銀行賬戶,當然也有書迷們喜歡的“Bookface”。當你需要放鬆時,會有調皮的小貓(emergency kittens)來陪你玩。他的這種天賦讓書中那些例子顯得既實用閤理又有趣。
寫書可謂是一件苦差事,但寫書的動力深深紮根在我心裏。正是這種動力促使我們幫助他人,講解知識,提升自我,改變世界。我問Avdi為何要寫這本書,他在郵件中提到瞭幾個原因,在此,我想分享其中的兩點。他說,“講解知識很有趣”,而且“整個社區一直以來都對我很好,我一直在想他們為什麼這麼好,我希望自己也可以(為社區)做點貢獻”。
現在你知道瞭,他就是這樣一個充滿幽默感和責任感的人。
Avdi寫的代碼可讀性非常高。在這本書裏,他將教你寫齣優雅的代碼。這對開發人員來講,真是無上的榮耀。
好好欣賞這本書吧!
Sandi Metz
2014年3月28日
優雅的Ruby 下載 mobi epub pdf txt 電子書 格式