編輯推薦
《麵嚮對象設計實踐指南:Ruby語言描述》一本直接關注Ruby語言麵嚮對象應用程序設計的書籍。對“如何編寫更易維護、更易管理、更討人喜愛,以及功能更為強大的Ruby應用程序”的全麵指導。
任何層次的Ruby程序員都能從中汲取有用的知識:初級的Ruby程序員將會找到賴以生存的特定準則,中等水平的Ruby程序員將會找到多條可以根據需要靈活地詮釋和應用的有價值的原則,高水平的Ruby程序員則會找到一種共同語言,用以引導開發和指導同事。
內容簡介
《麵嚮對象設計實踐指南:Ruby語言描述》是對“如何編寫更易維護、更易管理、更討人喜愛且功能更為強大的Ruby應用程序”的全麵指導。為幫助讀者解決Ruby代碼難以更改和不易擴展的問題,作者在書中運用瞭多種功能強大和實用的麵嚮對象設計技術,並藉助大量簡單實用的Ruby示例對這些技術進行全麵解釋。
全書共9章,主要包含的內容有:如何使用麵嚮對象編程技術編寫更易於維護和擴展的Ruby代碼,單個Ruby類所應包含的內容,避免將應該保持獨立的對象交織在一起,在多個對象之間定義靈活的接口,利用鴨子類型減少編程間接成本,閤理運用繼承,通過組閤構建對象,設計齣劃算的測試,解決不良設計的Ruby代碼所導緻的常見問題等。
《麵嚮對象設計實踐指南:Ruby語言描述》適閤所有對麵嚮對象設計和Ruby編程語言感興趣的程序員閱讀參考。
作者簡介
Sandi Metz,在處理經曆不斷變化仍然存活的項目方麵,Sandi Metz擁有30年的工作經驗。作為杜剋大學的一名軟件架構師,她每天都堅持編寫代碼。在杜剋大學裏,她的團隊不斷地為許多客戶解決大量實際問題。其中,有些客戶的應用程序不僅具有規模大和麵嚮對象的特點,而且已演變瞭15年之久。她全身心投入的工作是用簡單實用的方法將有用的軟件提取齣來。Sandi在Ruby Nation做過演講,在Gotham Ruby用戶大會上也演講過多次。本書是她做過的關於OO設計的談話匯集之後的必然成果。
譯者簡介
張雪平,西南石油大學畢業,模式識彆與智能係統專業,碩士研究生。擁有多年高校計算機相關課程的教學經驗,熱衷於計算機應用軟件的開發與研究。現從事石油行業相關軟件的研發工作。
彭曉東,西南師範大學畢業,計算機科學與技術專業。10餘年來,一直從事高校計算機網絡管理、軟件開發及教學工作。
內頁插圖
精彩書評
“這是一部厲害的作品!其描述如此生動活潑,讓我再一次發現埋藏在OO原則之下的真相。這些真相都藏匿很深,以緻我也忘記瞭去探究它們。作者的設計思維和對未來的認識尤其具有說服力。”
——Ian McFarland,New Context有限公司總裁
“對於一名自學成纔的程序員來說,這是一本對鑽研某些OOP概念非常有用的書籍。我顯然也需要對那些概念更加熟悉纔行。我並不孤獨,在工作的時候,總會有這樣一種提示在腦中不斷地閃現:‘Sandi Metz會怎麼做呢?’”
——Jonathan Mukai,Pivotal in NYC
“作者以一絲不苟的務實態度與細膩清晰的錶達方式,將那些令人難以捉摸的知識呈現給瞭迫切需要它的讀者。這些解決之道既可作為新手的準則,也可當作有經驗專業人士的指導。”
——Katrina Owen,Bengler開發人員
“我相信這是2012年重要的一本Ruby書籍。不僅因為作者100%抓住瞭要點,而且她還采用瞭輕鬆的寫作風格,並大量使用類比,讓每一個要點都淺顯易懂。”
——Avdi Grimm,Exceptional Ruby and Objects on Rails作者
目錄
第1章 麵嚮對象設計
1.1 設計贊歌
1.1.1 設計解決的問題
1.1.2 為何難以更改
1.1.3 實用的設計定義
1.2 設計工具
1.2.1 設計原則
1.2.2 設計模式
1.3 設計行為
1.3.1 設計失敗
1.3.2 設計時機
1.3.3 設計評
1.4 麵嚮對象編程簡介
1.4.1 過程式語言
1.4.2 麵嚮對象語言
1.5 小結
第2章 設計具有單一職責的類
2.1 決定類的內容
2.1.1 將方法分組成類
2.1.2 組織代碼以便於更改
2.2 創建具有單一職責的類
2.2.1 示例程序:自行車和齒輪
2.2.2 為何單一職責原則很重要
2.2.3 確定一個類是否具有單一職責
2.2.4 確定何時做齣設計決策
2.3 編寫擁抱變化的代碼
2.3.1 要依賴行為,不依賴數據
2.3.2 全麵推行單一職責原則
2.4 最後是真實的輪子需求
2.5 小結
第3章 管理依賴關係
3.1 理解依賴關係
3.1.1 認識依賴關係
3.1.2 對象間的耦閤
3.1.3 其他依賴關係
3.2 編寫鬆耦閤的代碼
3.2.1 注入依賴關係
3.2.2 隔離依賴關係
3.2.3 移除參數順序依賴關係
3.3 管理依賴方嚮
3.3.1 反轉依賴關係
3.3.2 選擇依賴方嚮
3.4 小結
第4章 創建靈活的接口
4.1 理解接口
4.2 定義接口
4.2.1 公共接口
4.2.2 私有接口
4.2.3 職責、依賴關係和接口
4.3 找齣公共接口
4.3.1 示例程序:自行車旅遊公司
4.3.2 構建意圖
4.3.3 使用時序圖
4.3.4 請詢問"要什麼",彆告知"如何做"
4.3.5 尋求上下文獨立
4.3.6 信任其他對象
4.3.7 使用消息來發現對象
4.3.8 創建基於消息的應用程序
4.4 編寫能展現其(內在)最好麵的代碼
4.4.1 創建顯式接口
4.4.2 善用其他類的公共接口
4.4.3 避免依賴私有接口
4.4.4 最小化上下文
4.5 迪米特法則
4.5.1 定義迪米特法則
4.5.2 違規的後果
4.5.3 避免違規
4.5.4 聽從迪米特法則
4.6 小結
第5章 使用鴨子類型技術降低成本
5.1 理解鴨子類型
5.1.1 鴨子類型概述
5.1.2 讓問題復雜些
5.1.3 發現鴨子類型
5.1.4 鴨子類型的後果
5.2 編寫依賴於鴨子類型的代碼
5.2.1 識彆齣隱藏的鴨子類型
5.2.2 信任你的鴨子類型
5.2.3 記錄好鴨子類型
5.2.4 在鴨子類型之間共享代碼
5.2.5 閤理選擇鴨子類型
5.3 剋服對鴨子類型的恐懼
5.3.1 使用靜態類型顛覆鴨子類型
5.3.2 靜態類型與動態類型
5.3.3 擁抱動態類型
5.4 小結
第6章 通過繼承獲得行為
6.1 理解經典的繼承
6.2 弄清使用繼承的地方
6.2.1 從一個具體類開始
6.2.2 嵌入多種類型
6.2.3 找齣嵌入的類型
6.2.4 選擇繼承
6.2.5 描繪齣繼承關係
6.3 誤用繼承
6.4 找齣抽象
6.4.1 創建抽象父類
6.4.2 提升抽象行為
6.4.3 從具體分離齣抽象
6.4.4 使用模闆方法模式
6.4.5 實現所有模闆方法
6.5 管理父類與子類之間的耦閤
6.5.1 理解耦閤
6.5.2 使用鈎子消息解耦子類
6.6 小結
第7章 使用模塊共享角色行為
7.1 理解角色
7.1.1 找齣角色
7.1.2 組織職責
7.1.3 刪除不必要的依賴關係
7.1.4 編寫具體代碼
7.1.5 提取抽象
7.1.6 查找方法
7.1.7 繼承角色行為
7.2 編寫可繼承的代碼
7.2.1 識彆齣反模式
7.2.2 堅持抽象
7.2.3 重視契約
7.2.4 使用模闆方法模式
7.2.5 預先將類解耦
7.2.6 創建淺層結構
7.3 小結
第8章 組閤對象
8.1 Parts組閤成Bicycle
8.1.1 更新Bicycle類
8.1.2 創建Parts層次結構
8.2 組閤成Parts對象
8.2.1 創建Part
8.2.2 讓Parts對象更像一個數組
8.3 製造Parts
8.3.1 創建PartsFactory
8.3.2 藉助PartsFactory
8.4 組閤成Bicycle
8.5 繼承和組閤的抉擇
8.5.1 接受繼承帶來的後果
8.5.2 接受組閤帶來的後果
8.5.3 選擇關係
8.6 小結
第9章 設計最劃算的測試
9.1 意圖測試
9.1.1 瞭解測試的意圖
9.1.2 瞭解測試的內容
9.1.3 瞭解測試的時機
9.1.4 瞭解測試的方法
9.2 測試輸入消息
9.2.1 刪除未使用的接口
9.2.2 證明公共接口
9.2.3 隔離測試對象
9.2.4 注入使用類的依賴關係
9.2.5 將依賴關係注入成角色
9.3 測試私有方法
9.3.1 在測試過程中忽略私有方法
9.3.2 從測試類裏移除私有方法
9.3.3 選擇測試私有方法
9.4 測試輸齣消息
9.4.1 忽略查詢消息
9.4.2 證明命令消息
9.5 測試鴨子類型
9.5.1 測試角色
9.5.2 用角色測試驗證測試替身
9.6 測試繼承代碼
9.6.1 指定繼承接口
9.6.2 指定子類責任
9.6.3 測試獨特行為
9.7 小結
後記
前言/序言
麵嚮對象設計實踐指南:Ruby語言描述 引言 在軟件開發的廣闊領域中,麵嚮對象設計(Object-Oriented Design, OOD)已成為構建復雜、可維護、可擴展係統的基石。它提供瞭一套強大的原則和模式,幫助開發者理解和組織代碼,使其更貼近現實世界的模型。本書《麵嚮對象設計實踐指南:Ruby語言描述》並非空泛地羅列理論,而是深入實踐,以Ruby語言為載體,為讀者提供一條清晰、可操作的學習路徑,掌握麵嚮對象設計的精髓,並能將其靈活應用於實際開發中。 本書旨在成為您在麵嚮對象設計旅程中的一位得力夥伴,為您揭示那些使得優秀代碼得以誕生的核心思想和策略。我們不追求理論的晦澀難懂,而是緻力於將抽象的概念轉化為生動的編程實踐,讓您在理解“為什麼”的同時,也能熟練掌握“怎麼做”。Ruby語言以其優雅的語法、富有錶現力的特性以及強大的元編程能力,為闡釋麵嚮對象設計提供瞭絕佳的平颱。通過Ruby,我們將能夠更直觀地感受封裝、繼承、多態等核心概念,並深入理解設計模式的實際應用。 核心內容概覽 本書的內容將圍繞以下幾個核心主題展開,循序漸進地引導讀者構建紮實的麵嚮對象設計功底: 第一部分:麵嚮對象設計的基石 理解對象與類: 這一部分將從最基礎的概念齣發,清晰地闡述對象(Object)和類(Class)在麵嚮對象編程中的作用。我們將深入探討類的定義、對象的創建、屬性(Attributes)和方法(Methods)的封裝,以及實例變量(Instance Variables)和類變量(Class Variables)的用途。通過Ruby的實例,讀者將能直觀地理解如何將現實世界的概念映射到代碼中的對象和類。 封裝:數據與行為的融閤: 封裝是麵嚮對象的核心原則之一。本書將詳細解釋封裝的目的,即隱藏對象的內部實現細節,並通過公共接口(Public Interface)來暴露必要的功能。我們將探討訪問控製(Access Control)的策略,以及如何通過 getter 和 setter 方法來安全地訪問和修改對象的屬性。Ruby的各種訪問修飾符(如 `public`, `protected`, `private`)將被詳細講解,並結閤實際代碼示例,展示如何有效地運用封裝來提高代碼的穩定性和可維護性。 繼承:代碼的復用與擴展: 繼承允許創建新的類(子類)來繼承現有類(父類)的屬性和行為,從而實現代碼的復用和功能的擴展。本書將深入講解繼承的機製,包括單繼承與多重繼承的區彆(以及Ruby如何通過Mixins解決多重繼承的問題),`super` 關鍵字的用法,以及如何利用繼承來構建具有層次結構的對象模型。我們將通過大量的Ruby代碼示例,展示如何設計閤理的繼承體係,避免代碼冗餘,並使係統更易於擴展。 多態:統一接口下的多樣化實現: 多態是麵嚮對象設計的另一項強大特性,它允許使用一個統一的接口來處理不同類型的對象。本書將重點闡述多態的概念,包括編譯時多態(方法重載,雖然Ruby原生支持度不高,但可以通過元編程等方式實現)和運行時多態(方法覆蓋,即子類重寫父類方法)。我們將深入分析多態如何提高代碼的靈活性和可讀性,並通過Ruby的鴨子類型(Duck Typing)特性,展示如何在動態類型語言中實現強大的多態性。 第二部分:麵嚮對象設計的核心原則(SOLID) SOLID 原則是麵嚮對象設計的“聖經”,是構建健壯、可維護、可擴展軟件的關鍵。本書將逐一深入解析這五個原則,並結閤Ruby語言的特點,提供豐富的實踐指導。 單一職責原則(Single Responsibility Principle, SRP): 一個類應該隻有一個引起它變化的原因。我們將探討如何識彆類的職責,以及如何通過職責的劃分來避免“萬能類”的齣現,從而提高類的內聚性。 開放-封閉原則(Open/Closed Principle, OCP): 軟件實體(類、模塊、函數等)應該對擴展開放,對修改封閉。本書將重點講解如何通過抽象、繼承和多態等技術來實現這一原則,使係統在增加新功能時,無需修改現有代碼。 裏氏替換原則(Liskov Substitution Principle, LSP): 子類型必須能夠替換掉它們的基類型,而程序的行為不會因此發生改變。我們將深入分析LSP的重要性,以及如何設計子類以滿足這一原則,避免齣現“is-a”關係下的行為不一緻。 接口隔離原則(Interface Segregation Principle, ISP): 客戶端不應該被強迫依賴於它們不使用的方法。本書將重點講解如何創建更精細的接口,避免臃腫的接口設計,從而降低耦閤度。 依賴倒置原則(Dependency Inversion Principle, DIP): 高層模塊不應該依賴於低層模塊,兩者都應該依賴於抽象。低層模塊對抽象的依賴應該與高層模塊的抽象保持一緻。我們將深入探討如何利用抽象(如模塊、接口)來解耦,使係統更易於替換和測試。 第三部分:設計模式在Ruby中的應用 設計模式是針對軟件設計中常見問題的成熟解決方案。本書將聚焦於一些最常用、最核心的設計模式,並通過Ruby語言的特性,展示它們如何優雅地實現。 創建型模式(Creational Patterns): 工廠模式(Factory Pattern): 封裝對象的創建過程,使客戶端代碼無需關心具體類的實例化。我們將展示如何使用Ruby的類方法或模塊來構建各種工廠。 單例模式(Singleton Pattern): 確保一個類隻有一個實例,並提供一個全局訪問點。我們將探討Ruby中實現單例的常用方法,例如使用 `Singleton` 模塊。 建造者模式(Builder Pattern): 分步創建復雜對象,允許同一創建過程創建不同錶示。 結構型模式(Structural Patterns): 適配器模式(Adapter Pattern): 允許不兼容的接口之間協同工作。我們將展示如何使用Ruby的模塊或類來創建適配器。 裝飾器模式(Decorator Pattern): 動態地給一個對象添加一些額外的職責。我們將深入講解Ruby的Mixins如何優雅地實現裝飾器模式。 外觀模式(Facade Pattern): 提供一個統一的接口,用於隱藏一係列子係統的復雜性。 行為型模式(Behavioral Patterns): 策略模式(Strategy Pattern): 定義一係列算法,將每一個算法封裝起來,並使它們可以互換。我們將重點講解Ruby的塊(Blocks)和 Proc 如何簡潔地實現策略模式。 觀察者模式(Observer Pattern): 定義對象之間的一對多依賴關係,當一個對象的狀態改變時,所有依賴於它的對象都會得到通知並自動更新。Ruby的 `observable` 模塊將是講解的重點。 模闆方法模式(Template Method Pattern): 在父類中定義一個算法的骨架,允許子類在不改變算法結構的前提下,重新定義算法的某些特定步驟。 第四部分:Ruby語言的麵嚮對象特性與實踐 Ruby語言本身就充滿瞭麵嚮對象的思想,並且提供瞭許多強大的特性來支持麵嚮對象的設計。 Mixins 與模塊(Modules): Ruby通過 Mixins(通過 `include` 或 `extend` 關鍵字)實現瞭代碼的復用和接口的共享,這與許多其他語言中的多重繼承有著異麯同工之妙,但更加靈活安全。我們將深入講解模塊的作用,以及如何利用它們來實現代碼的組織和模式的復用。 元編程(Metaprogramming): Ruby強大的元編程能力允許在運行時動態地修改類的定義、創建方法等。本書將介紹如何運用元編程來簡化代碼,實現更高級的設計模式,並提升代碼的靈活性。 鴨子類型(Duck Typing): Ruby的鴨子類型是其麵嚮對象特性的重要體現,它強調“如果它能像鴨子一樣叫,像鴨子一樣走路,那麼它就是一隻鴨子”,即關注對象的行為而非其類型。我們將深入探討鴨子類型如何影響我們的設計,以及如何有效地利用它來編寫更具彈性的代碼。 Ruby 中的 DSL(Domain-Specific Languages): Ruby的語法特性使得創建領域特定語言(DSL)變得相對容易。本書將探討如何利用麵嚮對象的設計原則來構建易於閱讀和使用的DSL,從而提高開發效率。 第五部分:麵嚮對象設計的進階話題與最佳實踐 在掌握瞭基礎和核心原則之後,本書還將引導讀者探索更深入的話題,以及在實際開發中應該遵循的最佳實踐。 測試驅動開發(Test-Driven Development, TDD)與麵嚮對象設計: 我們將探討 TDD 如何與麵嚮對象設計相輔相成,如何編寫可測試的麵嚮對象代碼,以及單元測試在驗證設計原則和模式方麵的作用。 重構(Refactoring)與設計改進: 軟件設計是一個持續演進的過程。本書將提供關於如何識彆代碼中的設計缺陷,並運用重構技術來改進現有設計的指導,使其更符閤麵嚮對象的設計原則。 麵嚮對象設計中的常見陷阱與避免策略: 總結在麵嚮對象設計過程中可能遇到的常見問題,例如過度設計、耦閤過緊、職責不清等,並提供相應的解決方案和避免策略。 Ruby 項目中的實際應用案例分析: 通過分析一些開源Ruby項目或虛構的實際應用場景,演示如何將本書所學的麵嚮對象設計原則和模式應用於解決真實世界的開發挑戰。 本書特色 Ruby 語言驅動: 全書以 Ruby 語言為載體,所有概念和模式都通過實際的、可運行的代碼示例來闡述,讓讀者在動手實踐中學習。 理論與實踐並重: 既講解瞭麵嚮對象設計背後的核心理論和原則,又深入探討瞭如何在 Ruby 中進行具體實現,避免理論脫離實踐。 循序漸進的學習麯綫: 內容從基礎概念到高級主題,逐步深入,適閤不同水平的 Ruby 開發者。 強調“為什麼”和“怎麼做”: 不僅僅是介紹“是什麼”,更注重解釋“為什麼”要這樣做,以及“怎麼做”纔能做得更好。 貼近實際開發: 關注解決實際開發中遇到的問題,提供可操作的建議和最佳實踐。 目標讀者 本書適閤所有希望提升軟件設計能力的 Ruby 開發者,包括: 初學者,希望係統學習麵嚮對象設計的核心概念和原則。 有一定經驗的開發者,希望深入理解麵嚮對象設計模式,並在 Ruby 項目中更有效地應用。 對編寫高質量、可維護、可擴展代碼有追求的工程師。 任何對 Ruby 語言的麵嚮對象特性感興趣並希望深入探索的開發者。 結語 麵嚮對象設計並非一蹴而就的技能,它需要持續的學習、實踐和反思。《麵嚮對象設計實踐指南:Ruby語言描述》將陪伴您在這條探索之路上,為您提供堅實的理論基礎、豐富的實踐經驗和清晰的行動指南。我們相信,通過本書的學習,您將能夠設計齣更優雅、更健壯、更具生命力的 Ruby 程序。讓我們一起,用麵嚮對象設計的智慧,構建更美好的軟件世界。