內容簡介
《軟體小設計》從最基本編程理論開始,探討了軟體設計中的基本概念,比如過程、對象、封裝、繼承、多態等;然後,在理清這些概念的基礎上,書中集中探討了構建好對象的若干原則;隨後,在這些思想和原則的基礎上,書中使用了大量的例子和篇幅分析了軟體設計過程中可能遇到的典型問題及可能的解決方案。最後,《軟體小設計》會嘗試脫離面向對象設計經驗的束縛,直面設計的自然面貌:設計也許不輕鬆,但是也許並不那么的複雜。
編輯推薦
本書首先介紹了面向對象設計中的基本概念,比如對象、元素、繼承、多態等;
然後集中探討了面向對象設計的基本原則,如KISS原則、單一職責原則、迪米特法則等;
隨後分析了設計的基本流程及可能遇到的各種問題,如設計原則、模式、重構等;
最後脫離面向對象設計經驗的束縛,直面設計的本來面貌。
內容提要
《軟體小設計》從最基本編程理論開始,探討了軟體設計中的基本概念,比如過程、對象、封裝、繼承、多態等;然後,在理清這些概念的基礎上,書中集中探討了構建好對象的若干原則;隨後,在這些思想和原則的基礎上,書中使用了大量的例子和篇幅分析了軟體設計過程中可能遇到的典型問題及可能的解決方案。最後,《軟體小設計》會嘗試脫離面向對象設計經驗的束縛,直面設計的自然面貌:設計也許不輕鬆,但是也許並不那么的複雜。
目錄
第1章 設計概論 1
1.1 面向對象程式設計 1
1.1.1 面向對象思想——任督二脈 1
1.1.2 面向對象設計原則——九陽神功 2
1.1.3 模式——乾坤大挪移 3
1.1.4 重構——太極拳 4
1.1.5 抽象與組合——獨孤九劍 5
1.2 面向過程與面向對象 5
1.3 設計的巨觀面貌 8
1.3.1 開發模式:自頂向下和自底向上 8
1.3.2 開發方式:疊代 9
1.3.3 開發結果:模組化 10
1.4 設計的微觀世界 10
1.4.1 函式 10
1.4.2 對象 12
1.5 小結 15
第2章 設計原則 16
2.1 通用原則 16
2.1.1 KISS原則 16
2.1.2 代碼之“形” 17
2.2 核心原則 20
2.2.1 單一職責原則(SRP):做一個專一的人 20
2.2.2 開放封閉原則(OCP):改造世界大部分不是破壞原來的秩序 21
2.2.3 里氏替換原則(LSP):長大後,我就成了你 24
2.2.4 接口分離原則(ISP):不要一口吃成胖子 26
2.2.5 依賴倒置原則(DIP):抽象的藝術才有生命力 27
2.3 擴展原則 28
2.3.1 迪米特法則:儘量不與無關的類發生關係 28
2.3.2 好萊塢法則:不要調用我,讓我調用你 29
2.3.3 優先使用組合原則:多使用組合,少使用繼承 31
2.4 小結 33
第3章 設計過程 34
3.1 設計目標 35
3.1.1 對象設計目標——“高內聚+低耦合” 35
3.1.2 對象設計過程——“折中+疊代+重構” 36
3.2 對象來源 38
3.3 對象創建 41
3.3.1 直接創建對象 41
3.3.2 間接創建對象 44
3.3.3 對象創建時機 51
3.4 對象管理 57
3.4.1 線性結構——集合對象 57
3.4.2 樹形組合結構 65
3.5 對象互動 71
3.5.1 組合——直接引用,互通有無 71
3.5.2 中介者——間接通信 74
3.5.3 事件——使用回調函式通信 77
3.5.4 互動即耦合 84
3.6 對象存儲 84
3.6.1 檔案存儲 85
3.6.2 資料庫存儲 94
3.7 訪問控制 114
3.8 組織協作 132
3.8.1 代碼的組織方式——“同步+異步+多執行緒” 132
3.8.2 業務的組織方式 138
3.9 對象布局 155
3.9.1 進入業務邏輯系統的第一道門檻——“Controller” 155
3.9.2 為什麼要分層——分層的意義 155
3.9.3 如何分層——價值導向 156
3.9.4 層的對接——模組化與面向接口編程 171
3.9.5 接口的轉換——適配器 172
3.9.6 接口的簡化——門面 175
3.9.7 層的載體——包 179
3.9.8 分層的代價——效率和複雜性 180
3.9.9 層效率的有益補充 180
3.10 應對變化 183
3.10.1 變化的根源 184
3.10.2 變化的種類 184
3.10.3 處理變化的原則 186
3.10.4 應對變化的設計思路 189
3.11 小結 199
第4章 模式 200
4.1 模式定義 200
4.2 模式的意義 202
4.3 模式有缺點嗎 203
4.4 設計的四個階段 206
4.4.1 第一個階段:設計不足 207
4.4.2 第二個階段:模仿設計 208
4.4.3 第三個階段:過度設計 208
4.4.4 第四個階段:適度設計 213
4.5 反模式 214
4.5.1 開發流程反模式 214
4.5.2 資料庫設計反模式 215
4.5.3 密碼管理反模式 217
4.5.4 .NET開發反模式 217
4.6 小結 220
第5章 重構 221
5.1 重構動機 221
5.1.1 軟體代碼是會腐爛的 222
5.1.2 破窗效應 223
5.1.3 技術債務 224
5.2 重構的定義 224
5.3 重構難題 224
5.3.1 技術上的難題 225
5.3.2 管理上的難題 225
5.3.3 個人難題——程式設計師心理學 226
5.4 好代碼長什麼樣 226
5.5 重構技法 230
5.5.1 基本技法——重命名 235
5.5.2 第一種技法——轉移職責 237
5.5.3 第二種技法——封裝細節 243
5.5.4 第三種技法——抽象對象 254
5.6 重構實施 259
5.6.1 重構的實施方式 259
5.6.2 重構的質量 261
5.7 小結 266
第6章 回到起點 267
6.1 忘掉模式 267
6.2 忘掉對象 269
6.3 回到起點 276
6.3.1 設計原本 277
6.3.2 設計的靜態性 277
6.3.3 設計的動態性 289
後記 292
前言
計算機編程誕生至今,理論和實踐的發展越來越豐富,各種程式語言也如雨後春筍般不斷出現,不斷壯大,不斷消亡;隨之而來的就是各種介紹電腦程式設計的書籍不斷湧現。
在這些著作中,不僅有介紹程式語言的書,如初級的語言規範介紹、中級的語言特性套用、高級的設計模式和軟體架構的實現,還有介紹編程技巧的書,如對象的設計、算法的分析、重構的實施、框架的套用,等等。這些書大部分都十分經典,內容集中在某一個具體的方面,就好比一顆顆珍珠零散地放在我們的案頭上。
對於我這樣從程式設計師過來的人來說,從入行的那天起,就不斷地有高人給我推薦這些由淺入深的經典到不能再經典的書籍,於是我不斷地採購這些書籍。每當手裡拎起這些沉重的書時,我就會深深地體會到知識的厚重。當然,從這些作者流暢而嚴謹的述說中,我還是逐漸地學習到了程式設計的各種知識。
在這樣的情況下,有一天,在思考之餘,我的腦中忽然有了一些大膽的想法:能否有一本書把這些經典的知識串起來,形成一個完整的體系呢?並且能否在這些理論和實踐的基礎上,再深挖一下設計本來的面目呢?良好的設計是否真的像那些高深的書籍描述的那樣是那么高不可攀,必須要經過多年的修煉才能談及呢?良好的設計是否真的需要那幾十本厚重的書才能描述清楚嗎?
為了回答這些問題,我決定寫些什麼,這是本書的寫作初衷。有時想想,覺得我還真的有點不自量力,但是反過來想想,我又覺得,不妨就當拋磚引玉吧。我真心希望這本拙劣的小書能引起真正想學習編程技術的讀者們的思考,能自己找到這些問題的答案。
本書將從最基本的面向對象編程開始,探討面向對象設計中的基本概念,比如對象、元素、繼承、多態等;然後,會探討面向對象設計的基本原則;隨後,會在這些思想和原則的基礎上分析設計的基本流程及可能遇到的各種問題。在最後一部分,我們會脫離面向對象的束縛,直面設計的自然面貌。
書中的例子大部分都使用C#來實現,一部分例子使用Java和JavaScript來實現,不過好在代碼都很簡單,喜愛其他語言的讀者看起來應該也是毫無壓力的。
不過請大家注意,這本書里沒有嚴密的論證,也沒有嚴謹的定義,更沒有高深的理論,因而還請大家抱著懷疑的態度閱讀本書吧。如果你期望讀到的是一本嚴謹、嚴密、高深的設計類書籍,那么這本書可能不適合你!
此外,現在大家經常會談到“網際網路思維”。在網際網路時代,知識被快速地創建出來,然後飛速地累積和傳播。本書的部分資料和圖片,是通過搜尋引擎直接找到並使用的,根本無法了解其最初的來源在哪裡,因此書中如果引用了哪位仁兄的大作但是沒有註明,還請見諒!你可以直接聯繫我,我會把你的作品及有關情況加到引用列表中。對於本書來說,我決定按照“網際網路思維”的玩法來對待,就是你可以在引用本書觀點的時候,說明引用自本書,當然不引用也沒關係,這取決於你自己的選擇,我只在意思想的傳播。
最後,感謝我的老婆周花梅和我兩個可愛的女兒董雨婷和董雨佳,正因為有了她們的愛和鼓舞,我才能夠堅持完成本書!