整潔代碼經(jīng)典實例
定 價:¥148
中 教 價:¥111.00 (7.50折)
庫 存 數(shù): 1
本書通過JavaScript、PHP、Python、Java等多種編程語言的真實示例,提供了經(jīng)過驗證的實踐方法,幫助你擴展和維護大型系統(tǒng)。每章涵蓋了包括可讀性、耦合性、可測試性、安全性和可擴展性在內(nèi)的基本概念,還有代碼壞味道及其相應的解決方案。隨著閱讀的深入,本書中的重構(gòu)實例及其解決的問題會變得越來越復雜。你將學習以下內(nèi)容:理解整潔代碼的好處,并學習如何識別改進機會。逐步學習重構(gòu)技術(shù)。理解整潔代碼背后的理論。在多種現(xiàn)代編程語言中看到實際的例子。獲得代碼壞味道的全面列表,了解它們的影響及可能的解決方案。編寫簡潔直觀的代碼,注重可讀性和學習性。
一本內(nèi)容豐富、理論深刻,并且包含許多實用例子的書,幫助你編寫整潔的代碼。強烈推薦給所有追求高質(zhì)量軟件的人。 Daniel Moka 軟件工匠,Moka ITMaxi是一位應用科學家,他在軟件開發(fā)領(lǐng)域的深刻專業(yè)知識在這本書中得到了精彩展現(xiàn)。 Alex Bunardzic 軟件開發(fā)者兼講師
前言代碼隨處可見,從網(wǎng)頁開發(fā)到智能合約、嵌入式系統(tǒng)、區(qū)塊鏈、詹姆斯·韋伯的機載軟件系統(tǒng)、外科手術(shù)機器人等各個領(lǐng)域。軟件有效地接管了世界,我們目前正在見證專業(yè)人工智能代碼生成工具的崛起。這意味著整潔的代碼比以往任何時候都更加重要。隨著你在日益龐大的專有或開源代碼庫中持續(xù)工作,整潔的代碼是保持其新鮮并隨時準備進化的方法。本書的讀者對象本書幫助你識別代碼庫中的常見問題,強調(diào)這些問題的后果,并最終通過易于跟隨的經(jīng)典實例幫助你避免這些問題。這是一本寶貴的資源,可以極大地幫助程序員、代碼審查者、架構(gòu)師和學生改善他們的編程技能和現(xiàn)有系統(tǒng)。本書的組織結(jié)構(gòu)本書分為25 章。每章都以一些原則和基礎知識開始,展示整潔代碼的好處、后果以及在錯誤應用時的缺點。第1 章討論了整潔代碼的單一指導規(guī)則:將真實世界的實體與你的設計進行一一映射。這一規(guī)則作為其他所有原則的基礎。在每章中,你會發(fā)現(xiàn)幾個按主題組織的經(jīng)典實例,提供工具和建議來改變你的代碼。每個經(jīng)典實例的目的是幫助你在當前情況下做出積極的改變和改進。除了經(jīng)典實例和示例外,你還將介紹各種軟件設計原則、啟發(fā)法和規(guī)則。由于整潔的代碼不僅僅是某一種編程語言的屬性,因此經(jīng)典實例中包含了多種編程語言的代碼示例。許多重構(gòu)書籍都依賴于一種語言,作者使用最新趨勢的編程語言。但這本書與編程語言無關(guān),大多數(shù)實例適用于許多語言(除非有說明)。即使大部分代碼可以直接運行,你也應該將代碼視為偽代碼。當我需要在可讀性和性能之間做出選擇時,我總是選擇可讀性。本書中提供了常見術(shù)語的定義,但你也可以在書中的術(shù)語表中找到它們的所有內(nèi)容。使用本書所需的條件為了運行代碼示例,你需要一個工作環(huán)境,比如 OReilly 沙盒(https://learning.oreilly.com/interactive)或 Replit(https://replit.com)。我鼓勵你將代碼示例轉(zhuǎn)換成你喜歡的編程語言。現(xiàn)在你可以利用人工智能代碼生成器免費進行翻譯。我使用過 GitHub Copilot、OpenAI Codex、Bard、ChatGPT 等工具來幫助我編寫本書的代碼示例。利用這些工具使我能夠在本書中使用超過25 種不同的編程語言,即使我并不是許多編程語言的專家。以數(shù)字格式獲取本書這本整潔代碼經(jīng)典實例提供了免費訪問的在線版本,隨時可用,并可進行搜索,網(wǎng)址為https://cleancodecookbook.com。本書中使用的約定本書使用以下排版約定:斜體(Italic)表示新術(shù)語、URL、電子郵件地址、文件名和文件擴展名。等寬字體(Constant width)用于程序清單,以及段落中引用程序元素,如變量或函數(shù)名稱、數(shù)據(jù)庫、數(shù)據(jù)類型、環(huán)境變量、語句和關(guān)鍵字。等寬加粗字體(Constant width bold)顯示用戶應該按照字面輸入的命令或其他文本。等寬斜體(Constant width italic)顯示應該用用戶提供的值或上下文確定的值替換的文本。使用代碼示例可從https://github.com/mcsee/clean-code-cookbook 下載補充材料(代碼示例、練習等)。如果你有技術(shù)問題或在使用代碼示例時遇到問題,請發(fā)送電子郵件至errata@oreilly.com.cn。這本書旨在幫助你完成工作。通常情況下,如果這本書提供了示例代碼,你可以在你的程序和文檔中使用它。除非你要復制大部分代碼,否則無需征得我們的許可。例如,編寫一個使用本書多個代碼塊的程序不需要許可。出售或分發(fā)來自OReilly 圖書的示例代碼需要許可。通過引用本書并引用示例代碼來回答問題不需要許可。將本書的大量示例代碼合并到產(chǎn)品文檔中需要許可。我們感謝但通常不要求署名。署名通常包括標題、作者、出版社和ISBN。例如:Clean Code Cookbook by Maximiliano Contieri (OReilly). Copyright 2023 Maximiliano Contieri。如果你認為你使用的代碼示例超出了合理使用范圍或上述許可的限制,請隨時與我們聯(lián)系,郵箱為permissions@oreilly.com。OReilly 在線學習平臺(OReilly Online Learning)近40 年來,OReilly Media 致力于提供技術(shù)和商業(yè)培訓、知識和卓越見解,來幫助眾多公司取得成功。公司獨有的專家和改革創(chuàng)新者網(wǎng)絡通過OReilly 書籍、文章以及在線學習平臺,分享他們的專業(yè)知識和實踐經(jīng)驗。OReilly 在線學習平臺按照您的需要提供實時培訓課程、深入學習渠道、交互式編程環(huán)境以及來自OReilly 和其他200 多家出版商的大量書籍與視頻資料。更多信息,請訪問網(wǎng)站:https://www.oreilly.com/。聯(lián)系我們?nèi)魏斡嘘P(guān)本書的意見或疑問,請按照以下地址聯(lián)系出版社。美國:OReilly Media, Inc.1005 Gravenstein Highway NorthSebastopol, CA 95472中國:北京市西城區(qū)西直門南大街2 號成銘大廈C 座807 室(100035)奧萊利技術(shù)咨詢(北京)有限公司我們?yōu)楸緯⒘艘粋網(wǎng)頁,列出勘誤表、示例和任何額外信息。你可以在https://oreil.ly/clean-code-cookbook 上訪問此頁面。有關(guān)我們的圖書和課程的新聞和信息,請訪問https://oreilly.com。在LinkedIn 上找到我們:https://linkedin.com/company/oreilly-media。在Twitter 上關(guān)注我們:https://twitter.com/oreillymedia。在YouTube 上觀看我們:https://youtube.com/oreillymedia。致謝這本書獻給我的妻子Maria Virginia,她一直充滿愛心和支持,還有我親愛的女兒Malena 和Miranda,以及我的父母Juan Carlos 和Alicia。我深表感謝Maximo Prieto 和Hernan Wilkinson,他們寶貴的見解和知識為本書提出的觀點做出了巨大貢獻。我也感激我在軟件工程公司的同事們分享的想法,以及我在布宜諾斯艾利斯大學的同行老師多年來分享的知識和專業(yè)知識。最后,我要感謝技術(shù)審閱者Luben Alexandrov、Daniel Moka 和Carlos E. Ferro,以及我的編輯Sara Hunter,他們的指導和建議極大地改進了這本書。
Maximiliano Contieri在軟件行業(yè)工作了25年,同時在布宜諾斯艾利斯大學教授計算機科學。他還在流行的博客平臺和會議上發(fā)表了關(guān)于整潔代碼、重構(gòu)和代碼壞味道的文章。他提倡利用軟件基礎原理構(gòu)建優(yōu)雅而健壯的解決方案,倡導聲明式和行為式編碼風格。
目錄序 1前言 3第1 章 整潔代碼 91.1 什么是代碼壞味道? .91.2 重構(gòu)是什么? .101.3 什么是經(jīng)典實例? 101.4 為什么要寫整潔的代碼? 111.5 可讀性、性能,或者兩者兼而有之. 111.6 軟件類型 111.7 機器生成的代碼 121.8 本書中的命名考慮 121.9 設計模式131.10 編程語言范式 131.11 對象與類的比較 131.12 可變性 .14第2 章 建立原則 152.0 引言 .152.1 為什么它是一個模型? .162.2 為什么它是抽象的? 162.3 為什么它是可編程的? .162.4 為什么它是部分的? 172.5 為什么它是解釋性的? .172.6 為什么它與現(xiàn)實有關(guān)? .182.7 推斷規(guī)則182.8 唯一的軟件設計原則 18第3 章 貧血模型 253.0 引言 .253.1 將貧血對象轉(zhuǎn)換為豐富對象 263.2 識別你的對象的本質(zhì) 283.3 移除對象中的setter .303.4 移除貧血代碼生成器 323.5 移除自動屬性 .343.6 移除DTO .353.7 完善空構(gòu)造函數(shù) 393.8 移除getter 403.9 防止對象隨意調(diào)用 443.10 移除動態(tài)屬性 45第4 章 原始偏執(zhí) 494.0 引言 .494.1 創(chuàng)建小對象 504.2 實例化原始數(shù)據(jù) 524.3 實例化關(guān)聯(lián)數(shù)組 534.4 移除濫用字符串 554.5 實例化時間戳 .574.6 實例化子集為對象 584.7 實例化字符串驗證 594.8 移除不必要的屬性 624.9 創(chuàng)建日期區(qū)間 .64第5 章 可變性 675.0 引言 .675.1 將變量改為常量 695.2 聲明變量為可變變量 705.3 禁止改變本質(zhì) .725.4 避免可變的常量數(shù)組 745.5 移除延遲初始化 765.6 凍結(jié)可變常量 .785.7 移除副作用 815.8 防止提升82第6 章 聲明式代碼 856.0 引言 .856.1 縮小重用變量的范圍 866.2 移除空行876.3 移除帶版本的方法 896.4 移除雙重否定 .906.5 改變錯位的責任 916.6 替換顯式迭代 .936.7 記錄設計決策 .946.8 用常量替換魔法數(shù)字 956.9 分離是什么和怎么做 976.10 文檔化正則表達式 .986.11 重寫Yoda 條件 996.12 移除滑稽方法 1006.13 避免回調(diào)地獄 1016.14 生成良好的錯誤消息 .1046.15 避免魔法修正 106第7 章 命名 . 1097.0 引言 1097.1 擴展縮寫.1097.2 重命名和拆分Helpers 和Utils 1127.3 重命名MyObjects . 1157.4 重命名結(jié)果變量 . 1167.5 重命名以類型命名的變量 . 1187.6 重命名長名稱 1197.7 重命名抽象名稱 .1207.8 更正拼寫錯誤 1227.9 從屬性中移除類名 .1227.10 移除類和接口的首字母 1247.11 重命名base/do 函數(shù) 1257.12 將復數(shù)類轉(zhuǎn)換為單數(shù) .1277.13 從名稱中移除Collection .1287.14 移除類名中的Impl前綴/ 后綴 .1297.15 根據(jù)角色重命名參數(shù) .1307.16 移除冗余的參數(shù)名稱 .1317.17 移除名稱中的不必要上下文 1337.18 避免數(shù)據(jù)命名 134第8 章 注釋 . 1378.0 引言 1378.1 刪除被注釋的代碼 .1388.2 刪除過時的注釋 .1408.3 刪除邏輯注釋 1418.4 刪除Getter 注釋 .1438.5 將注釋轉(zhuǎn)換為函數(shù)名稱 1448.6 刪除方法內(nèi)的注釋 .1458.7 用測試替換注釋 148第9 章 標準 . 1519.0 引言 1519.1 遵循代碼規(guī)范 1519.2 統(tǒng)一縮進方式 1549.3 統(tǒng)一命名規(guī)范 1569.4 用英文編寫代碼 .1579.5 統(tǒng)一參數(shù)順序 1599.6 修復另外的問題 .160第10 章 復雜性 16310.0 引言 16310.1 移除重復代碼 16310.2 移除設置/ 配置和功能切換 16610.3 將狀態(tài)作為屬性更改 .16710.4 移除代碼中的特殊設計 17010.5 打破多個Promises 17210.6 打破長鏈的協(xié)作 17310.7 將方法提取到對象中 .17510.8 關(guān)注數(shù)組構(gòu)造函數(shù) 17710.9 移除幽靈對象 179第11 章 膨脹者 18111.0 引言 18111.1 分解過長的方法 18111.2 減少過多參數(shù) 18311.3 減少多余變量 18511.4 移除過多的括號 18811.5 移除過多的方法 18911.6 分解過多的屬性 19011.7 減少導入列表 19211.8 拆分與功能 19311.9 拆分臃腫的接口 195第12 章 YAGNI 19912.0 引言 19912.1 移除死代碼 .20012.2 使用代碼代替圖表 20112.3 重構(gòu)只有一個子類的類 20312.4 移除只使用一次的接口 20512.5 移除設計模式的濫用 .20712.6 替換業(yè)務集合 208第13 章 快速失敗 21113.0 引言 21113.1 變量重新賦值的重構(gòu) . 21113.2 強制前提條件 21313.3 使用更嚴格的參數(shù) 21613.4 移除開關(guān)語句中的默認情況 21713.5 避免在遍歷時修改集合 21913.6 重新定義哈希和相等性 22013.7 無功能性變化的重構(gòu) .222第14 章 條件語句 22514.0 引言 22514.1 用多態(tài)替換偶然的if 語句 22614.2 為事件重命名標志變量 23414.3 實例化布爾變量 23514.4 替換Switch/Case/elseif 語句 .23714.5 使用集合替換硬編碼的if 條件 .23914.6 將布爾值改為短路條件 24114.7 添加隱式else .24214.8 重寫條件箭頭代碼 24314.9 避免使用短路技巧 24514.10 重寫嵌套的箭頭代碼 24714.11 避免返回布爾值進行條件檢查 24914.12 更改布爾值的比較方式 .25114.13 從長三元表達式中提取 .25214.14 將非多態(tài)函數(shù)轉(zhuǎn)換為多態(tài)函數(shù) 25414.15 改變相等比較 .25614.16 使硬編碼的業(yè)務條件具體化 25714.17 移除不必要的布爾值 25814.18 重寫嵌套三元條件 259第15 章 空值 26315.0 簡介 26315.1 創(chuàng)建空對象 .26315.2 移除可選鏈路 26715.3 將可選屬性轉(zhuǎn)換為集合 27015.4 使用真實對象作為空對象27215.5 不使用空對象表示未知位置 275第16 章 過早優(yōu)化 27916.0 引言 27916.1 避免對象上的標識符 .28016.2 移除過早的優(yōu)化 28316.3 移除位運算的過早優(yōu)化 28516.4 減少過度泛化 28616.5 改變結(jié)構(gòu)優(yōu)化 28716.6 移除錨定船只 28916.7 從領(lǐng)域?qū)ο笾刑崛【彺?29016.8 基于實現(xiàn)的回調(diào)事件的移除 29316.9 移除構(gòu)造函數(shù)中的查詢 29416.10 從析構(gòu)函數(shù)中移除代碼 .295第17 章 耦合 29917.0 引言 29917.1 顯式化隱藏假設 29917.2 替換單例模式 30117.3 打破上帝對象 30417.4 打破分歧性變更 30717.5 將9999 特殊標志值轉(zhuǎn)換為正常值 .30917.6 移除散彈代碼 31117.7 移除可選參數(shù) 31317.8 防止特性依戀 31517.9 移除中間人 .31717.10 將默認參數(shù)移到末尾 31917.11 避免連鎖反應 .32117.12 移除業(yè)務對象上的意外方法 32317.13 從用戶界面中移除業(yè)務代碼 32417.14 改變類之間的耦合 32817.15 重構(gòu)數(shù)據(jù)團 33017.16 打破不恰當?shù)挠H密關(guān)系 .33217.17 轉(zhuǎn)換可互換對象.334第18 章 全局變量 33718.0 引言 33718.1 實例化全局函數(shù) 33718.2 實例化靜態(tài)函數(shù) 33918.3 用結(jié)構(gòu)化代碼替換GoTo .34018.4 移除全局類 .34118.5 改變?nèi)秩掌趧?chuàng)建 344第19 章 層次結(jié)構(gòu) 34719.0 引言 34719.1 打破深層繼承 34719.2 打破悠悠球?qū)哟谓Y(jié)構(gòu) .35019.3 打破子分類以重用代碼 35219.4 用行為替換is-a關(guān)系 .35519.5 移除嵌套類 .35719.6 重命名孤立類 35919.7 使具體類成為最終類 .36019.8 顯式定義類的繼承關(guān)系 36219.9 遷移空類 36419.10 推遲過早的分類.36619.11 移除受保護的屬性 36819.12 完成空實現(xiàn) 370第20 章 測試 37320.0 引言 37320.1 測試私有方法 37420.2 為斷言添加描述 37620.3 將 assertTrue 遷移到特定斷言 37720.4 用真實對象替換模擬對象 37920.5 優(yōu)化通用斷言 38220.6 移除不穩(wěn)定的測試 38320.7 更改浮點數(shù)斷言 38520.8 將測試數(shù)據(jù)改為真實數(shù)據(jù)38620.9 保護違反封裝的測試 .38920.10 移除不相關(guān)的測試信息 .39120.11 在每個合并請求中添加覆蓋率 39320.12 根據(jù)日期重寫測試 39420.13 學習一種新的編程語言 .396第21 章 技術(shù)債務 39921.0 引言 39921.1 移除依賴于生產(chǎn)環(huán)境的代碼 40021.2 移除缺陷跟蹤器 40221.3 移除警告/ 嚴格模式關(guān)閉 40321.4 預防和移除 ToDo 和 FixMe 405第22 章 異常 40722.0 引言 40722.1 刪除空的異常塊 40722.2 刪除不必要的異常 40922.3 重寫預期情況下的異常 41122.4 重寫嵌套的try/catch 塊 41222.5 用異常替換返回代碼 .41422.6 重寫異常箭頭代碼 41622.7 隱藏終端用戶的低級錯誤41822.8 縮小異常范圍 419第23 章 元編程 42323.0 簡介 42323.1 移除元編程用法 42423.2 實例化匿名函數(shù) 42823.3 移除預處理器 43023.4 移除動態(tài)方法 431第24 章 類型 43524.0 引言 43524.1 移除類型檢查 43524.2 處理真值 43724.3 將浮點數(shù)改為小數(shù) 441第25 章 安全性 44325.0 引言 44325.1 輸入過濾 44325.2 更改順序ID 44525.3 移除包依賴 .44725.4 替換惡意正則表達式 .44925.5 保護對象反序列化 450術(shù)語表 453