| |
定 價:148 元
當前圖書已被 2 所學校薦購過!
查看明細
- 作者:[阿根廷]馬克西米利亞諾 孔蒂耶里(Maximiliano Contieri)
- 出版時間:2024/10/1
- ISBN:9787519892401
- 出 版 社:中國電力出版社
- 中圖法分類:O157.4
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開

本書通過JavaScript、PHP、Python、Java等多種編程語言的真實示例,提供了經過驗證的實踐方法,幫助你擴展和維護大型系統(tǒng)。每章涵蓋了包括可讀性、耦合性、可測試性、安全性和可擴展性在內的基本概念,還有代碼壞味道及其相應的解決方案。隨著閱讀的深入,本書中的重構實例及其解決的問題會變得越來越復雜。你將學習以下內容:理解整潔代碼的好處,并學習如何識別改進機會。逐步學習重構技術。理解整潔代碼背后的理論。在多種現(xiàn)代編程語言中看到實際的例子。獲得代碼壞味道的全面列表,了解它們的影響及可能的解決方案。編寫簡潔直觀的代碼,注重可讀性和學習性。
一本內容豐富、理論深刻,并且包含許多實用例子的書,幫助你編寫整潔的代碼。強烈推薦給所有追求高質量軟件的人。 Daniel Moka 軟件工匠,Moka IT Maxi是一位應用科學家,他在軟件開發(fā)領域的深刻專業(yè)知識在這本書中得到了精彩展現(xiàn)。 Alex Bunardzic 軟件開發(fā)者兼講師
前言代碼隨處可見,從網(wǎng)頁開發(fā)到智能合約、嵌入式系統(tǒng)、區(qū)塊鏈、詹姆斯·韋伯的機載軟件系統(tǒng)、外科手術機器人等各個領域。軟件有效地接管了世界,我們目前正在見證專業(yè)人工智能代碼生成工具的崛起。這意味著整潔的代碼比以往任何時候都更加重要。隨著你在日益龐大的專有或開源代碼庫中持續(xù)工作,整潔的代碼是保持其新鮮并隨時準備進化的方法。本書的讀者對象本書幫助你識別代碼庫中的常見問題,強調這些問題的后果,并最終通過易于跟隨的經典實例幫助你避免這些問題。這是一本寶貴的資源,可以極大地幫助程序員、代碼審查者、架構師和學生改善他們的編程技能和現(xiàn)有系統(tǒng)。本書的組織結構本書分為25 章。每章都以一些原則和基礎知識開始,展示整潔代碼的好處、后果以及在錯誤應用時的缺點。第1 章討論了整潔代碼的單一指導規(guī)則:將真實世界的實體與你的設計進行一一映射。這一規(guī)則作為其他所有原則的基礎。在每章中,你會發(fā)現(xiàn)幾個按主題組織的經典實例,提供工具和建議來改變你的代碼。每個經典實例的目的是幫助你在當前情況下做出積極的改變和改進。除了經典實例和示例外,你還將介紹各種軟件設計原則、啟發(fā)法和規(guī)則。由于整潔的代碼不僅僅是某一種編程語言的屬性,因此經典實例中包含了多種編程語言的代碼示例。許多重構書籍都依賴于一種語言,作者使用最新趨勢的編程語言。但這本書與編程語言無關,大多數(shù)實例適用于許多語言(除非有說明)。即使大部分代碼可以直接運行,你也應該將代碼視為偽代碼。當我需要在可讀性和性能之間做出選擇時,我總是選擇可讀性。本書中提供了常見術語的定義,但你也可以在書中的術語表中找到它們的所有內容。使用本書所需的條件為了運行代碼示例,你需要一個工作環(huán)境,比如 OReilly 沙盒(https://learning.oreilly.com/interactive)或 Replit(https://replit.com)。我鼓勵你將代碼示例轉換成你喜歡的編程語言,F(xiàn)在你可以利用人工智能代碼生成器免費進行翻譯。我使用過 GitHub Copilot、OpenAI Codex、Bard、ChatGPT 等工具來幫助我編寫本書的代碼示例。利用這些工具使我能夠在本書中使用超過25 種不同的編程語言,即使我并不是許多編程語言的專家。以數(shù)字格式獲取本書這本整潔代碼經典實例提供了免費訪問的在線版本,隨時可用,并可進行搜索,網(wǎng)址為https://cleancodecookbook.com。本書中使用的約定本書使用以下排版約定:斜體(Italic)表示新術語、URL、電子郵件地址、文件名和文件擴展名。等寬字體(Constant width)用于程序清單,以及段落中引用程序元素,如變量或函數(shù)名稱、數(shù)據(jù)庫、數(shù)據(jù)類型、環(huán)境變量、語句和關鍵字。等寬加粗字體(Constant width bold)顯示用戶應該按照字面輸入的命令或其他文本。等寬斜體(Constant width italic)顯示應該用用戶提供的值或上下文確定的值替換的文本。使用代碼示例可從https://github.com/mcsee/clean-code-cookbook 下載補充材料(代碼示例、練習等)。如果你有技術問題或在使用代碼示例時遇到問題,請發(fā)送電子郵件至errata@oreilly.com.cn。這本書旨在幫助你完成工作。通常情況下,如果這本書提供了示例代碼,你可以在你的程序和文檔中使用它。除非你要復制大部分代碼,否則無需征得我們的許可。例如,編寫一個使用本書多個代碼塊的程序不需要許可。出售或分發(fā)來自OReilly 圖書的示例代碼需要許可。通過引用本書并引用示例代碼來回答問題不需要許可。將本書的大量示例代碼合并到產品文檔中需要許可。我們感謝但通常不要求署名。署名通常包括標題、作者、出版社和ISBN。例如:Clean Code Cookbook by Maximiliano Contieri (OReilly). Copyright 2023 Maximiliano Contieri。如果你認為你使用的代碼示例超出了合理使用范圍或上述許可的限制,請隨時與我們聯(lián)系,郵箱為permissions@oreilly.com。OReilly 在線學習平臺(OReilly Online Learning)近40 年來,OReilly Media 致力于提供技術和商業(yè)培訓、知識和卓越見解,來幫助眾多公司取得成功。公司獨有的專家和改革創(chuàng)新者網(wǎng)絡通過OReilly 書籍、文章以及在線學習平臺,分享他們的專業(yè)知識和實踐經驗。OReilly 在線學習平臺按照您的需要提供實時培訓課程、深入學習渠道、交互式編程環(huán)境以及來自OReilly 和其他200 多家出版商的大量書籍與視頻資料。更多信息,請訪問網(wǎng)站:https://www.oreilly.com/。聯(lián)系我們任何有關本書的意見或疑問,請按照以下地址聯(lián)系出版社。美國:OReilly Media, Inc.1005 Gravenstein Highway NorthSebastopol, CA 95472中國:北京市西城區(qū)西直門南大街2 號成銘大廈C 座807 室(100035)奧萊利技術咨詢(北京)有限公司我們?yōu)楸緯⒘艘粋網(wǎng)頁,列出勘誤表、示例和任何額外信息。你可以在https://oreil.ly/clean-code-cookbook 上訪問此頁面。有關我們的圖書和課程的新聞和信息,請訪問https://oreilly.com。在LinkedIn 上找到我們:https://linkedin.com/company/oreilly-media。在Twitter 上關注我們:https://twitter.com/oreillymedia。在YouTube 上觀看我們:https://youtube.com/oreillymedia。致謝這本書獻給我的妻子Maria Virginia,她一直充滿愛心和支持,還有我親愛的女兒Malena 和Miranda,以及我的父母Juan Carlos 和Alicia。我深表感謝Maximo Prieto 和Hernan Wilkinson,他們寶貴的見解和知識為本書提出的觀點做出了巨大貢獻。我也感激我在軟件工程公司的同事們分享的想法,以及我在布宜諾斯艾利斯大學的同行老師多年來分享的知識和專業(yè)知識。最后,我要感謝技術審閱者Luben Alexandrov、Daniel Moka 和Carlos E. Ferro,以及我的編輯Sara Hunter,他們的指導和建議極大地改進了這本書。
Maximiliano Contieri在軟件行業(yè)工作了25年,同時在布宜諾斯艾利斯大學教授計算機科學。他還在流行的博客平臺和會議上發(fā)表了關于整潔代碼、重構和代碼壞味道的文章。他提倡利用軟件基礎原理構建優(yōu)雅而健壯的解決方案,倡導聲明式和行為式編碼風格。
目錄 序 1 前言 3 第1 章 整潔代碼 9 1.1 什么是代碼壞味道? .9 1.2 重構是什么? .10 1.3 什么是經典實例? 10 1.4 為什么要寫整潔的代碼? 11 1.5 可讀性、性能,或者兩者兼而有之. 11 1.6 軟件類型 11 1.7 機器生成的代碼 12 1.8 本書中的命名考慮 12 1.9 設計模式13 1.10 編程語言范式 13 1.11 對象與類的比較 13 1.12 可變性 .14 第2 章 建立原則 15 2.0 引言 .15 2.1 為什么它是一個模型? .16 2.2 為什么它是抽象的? 16 2.3 為什么它是可編程的? .16 2.4 為什么它是部分的? 17 2.5 為什么它是解釋性的? .17 2.6 為什么它與現(xiàn)實有關? .18 2.7 推斷規(guī)則18 2.8 唯一的軟件設計原則 18 第3 章 貧血模型 25 3.0 引言 .25 3.1 將貧血對象轉換為豐富對象 26 3.2 識別你的對象的本質 28 3.3 移除對象中的setter .30 3.4 移除貧血代碼生成器 32 3.5 移除自動屬性 .34 3.6 移除DTO .35 3.7 完善空構造函數(shù) 39 3.8 移除getter 40 3.9 防止對象隨意調用 44 3.10 移除動態(tài)屬性 45 第4 章 原始偏執(zhí) 49 4.0 引言 .49 4.1 創(chuàng)建小對象 50 4.2 實例化原始數(shù)據(jù) 52 4.3 實例化關聯(lián)數(shù)組 53 4.4 移除濫用字符串 55 4.5 實例化時間戳 .57 4.6 實例化子集為對象 58 4.7 實例化字符串驗證 59 4.8 移除不必要的屬性 62 4.9 創(chuàng)建日期區(qū)間 .64 第5 章 可變性 67 5.0 引言 .67 5.1 將變量改為常量 69 5.2 聲明變量為可變變量 70 5.3 禁止改變本質 .72 5.4 避免可變的常量數(shù)組 74 5.5 移除延遲初始化 76 5.6 凍結可變常量 .78 5.7 移除副作用 81 5.8 防止提升82 第6 章 聲明式代碼 85 6.0 引言 .85 6.1 縮小重用變量的范圍 86 6.2 移除空行87 6.3 移除帶版本的方法 89 6.4 移除雙重否定 .90 6.5 改變錯位的責任 91 6.6 替換顯式迭代 .93 6.7 記錄設計決策 .94 6.8 用常量替換魔法數(shù)字 95 6.9 分離是什么和怎么做 97 6.10 文檔化正則表達式 .98 6.11 重寫Yoda 條件 99 6.12 移除滑稽方法 100 6.13 避免回調地獄 101 6.14 生成良好的錯誤消息 .104 6.15 避免魔法修正 106 第7 章 命名 . 109 7.0 引言 109 7.1 擴展縮寫.109 7.2 重命名和拆分Helpers 和Utils 112 7.3 重命名MyObjects . 115 7.4 重命名結果變量 . 116 7.5 重命名以類型命名的變量 . 118 7.6 重命名長名稱 119 7.7 重命名抽象名稱 .120 7.8 更正拼寫錯誤 122 7.9 從屬性中移除類名 .122 7.10 移除類和接口的首字母 124 7.11 重命名base/do 函數(shù) 125 7.12 將復數(shù)類轉換為單數(shù) .127 7.13 從名稱中移除Collection .128 7.14 移除類名中的Impl前綴/ 后綴 .129 7.15 根據(jù)角色重命名參數(shù) .130 7.16 移除冗余的參數(shù)名稱 .131 7.17 移除名稱中的不必要上下文 133 7.18 避免數(shù)據(jù)命名 134 第8 章 注釋 . 137 8.0 引言 137 8.1 刪除被注釋的代碼 .138 8.2 刪除過時的注釋 .140 8.3 刪除邏輯注釋 141 8.4 刪除Getter 注釋 .143 8.5 將注釋轉換為函數(shù)名稱 144 8.6 刪除方法內的注釋 .145 8.7 用測試替換注釋 148 第9 章 標準 . 151 9.0 引言 151 9.1 遵循代碼規(guī)范 151 9.2 統(tǒng)一縮進方式 154 9.3 統(tǒng)一命名規(guī)范 156 9.4 用英文編寫代碼 .157 9.5 統(tǒng)一參數(shù)順序 159 9.6 修復另外的問題 .160 第10 章 復雜性 163 10.0 引言 163 10.1 移除重復代碼 163 10.2 移除設置/ 配置和功能切換 166 10.3 將狀態(tài)作為屬性更改 .167 10.4 移除代碼中的特殊設計 170 10.5 打破多個Promises 172 10.6 打破長鏈的協(xié)作 173 10.7 將方法提取到對象中 .175 10.8 關注數(shù)組構造函數(shù) 177 10.9 移除幽靈對象 179 第11 章 膨脹者 181 11.0 引言 181 11.1 分解過長的方法 181 11.2 減少過多參數(shù) 183 11.3 減少多余變量 185 11.4 移除過多的括號 188 11.5 移除過多的方法 189 11.6 分解過多的屬性 190 11.7 減少導入列表 192 11.8 拆分與功能 193 11.9 拆分臃腫的接口 195 第12 章 YAGNI 199 12.0 引言 199 12.1 移除死代碼 .200 12.2 使用代碼代替圖表 201 12.3 重構只有一個子類的類 203 12.4 移除只使用一次的接口 205 12.5 移除設計模式的濫用 .207 12.6 替換業(yè)務集合 208 第13 章 快速失敗 211 13.0 引言 211 13.1 變量重新賦值的重構 . 211 13.2 強制前提條件 213 13.3 使用更嚴格的參數(shù) 216 13.4 移除開關語句中的默認情況 217 13.5 避免在遍歷時修改集合 219 13.6 重新定義哈希和相等性 220 13.7 無功能性變化的重構 .222 第14 章 條件語句 225 14.0 引言 225 14.1 用多態(tài)替換偶然的if 語句 226 14.2 為事件重命名標志變量 234 14.3 實例化布爾變量 235 14.4 替換Switch/Case/elseif 語句 .237 14.5 使用集合替換硬編碼的if 條件 .239 14.6 將布爾值改為短路條件 241 14.7 添加隱式else .242 14.8 重寫條件箭頭代碼 243 14.9 避免使用短路技巧 245 14.10 重寫嵌套的箭頭代碼 247 14.11 避免返回布爾值進行條件檢查 249 14.12 更改布爾值的比較方式 .251 14.13 從長三元表達式中提取 .252 14.14 將非多態(tài)函數(shù)轉換為多態(tài)函數(shù) 254 14.15 改變相等比較 .256 14.16 使硬編碼的業(yè)務條件具體化 257 14.17 移除不必要的布爾值 258 14.18 重寫嵌套三元條件 259 第15 章 空值 263 15.0 簡介 263 15.1 創(chuàng)建空對象 .263 15.2 移除可選鏈路 267 15.3 將可選屬性轉換為集合 270 15.4 使用真實對象作為空對象272 15.5 不使用空對象表示未知位置 275 第16 章 過早優(yōu)化 279 16.0 引言 279 16.1 避免對象上的標識符 .280 16.2 移除過早的優(yōu)化 283 16.3 移除位運算的過早優(yōu)化 285 16.4 減少過度泛化 286 16.5 改變結構優(yōu)化 287 16.6 移除錨定船只 289 16.7 從領域對象中提取緩存 290 16.8 基于實現(xiàn)的回調事件的移除 293 16.9 移除構造函數(shù)中的查詢 294 16.10 從析構函數(shù)中移除代碼 .295 第17 章 耦合 299 17.0 引言 299 17.1 顯式化隱藏假設 299 17.2 替換單例模式 301 17.3 打破上帝對象 304 17.4 打破分歧性變更 307 17.5 將9999 特殊標志值轉換為正常值 .309 17.6 移除散彈代碼 311 17.7 移除可選參數(shù) 313 17.8 防止特性依戀 315 17.9 移除中間人 .317 17.10 將默認參數(shù)移到末尾 319 17.11 避免連鎖反應 .321 17.12 移除業(yè)務對象上的意外方法 323 17.13 從用戶界面中移除業(yè)務代碼 324 17.14 改變類之間的耦合 328 17.15 重構數(shù)據(jù)團 330 17.16 打破不恰當?shù)挠H密關系 .332 17.17 轉換可互換對象.334 第18 章 全局變量 337 18.0 引言 337 18.1 實例化全局函數(shù) 337 18.2 實例化靜態(tài)函數(shù) 339 18.3 用結構化代碼替換GoTo .340 18.4 移除全局類 .341 18.5 改變全局日期創(chuàng)建 344 第19 章 層次結構 347 19.0 引言 347 19.1 打破深層繼承 347 19.2 打破悠悠球層次結構 .350 19.3 打破子分類以重用代碼 352 19.4 用行為替換is-a關系 .355 19.5 移除嵌套類 .357 19.6 重命名孤立類 359 19.7 使具體類成為最終類 .360 19.8 顯式定義類的繼承關系 362 19.9 遷移空類 364 19.10 推遲過早的分類.366 19.11 移除受保護的屬性 368 19.12 完成空實現(xiàn) 370 第20 章 測試 373 20.0 引言 373 20.1 測試私有方法 374 20.2 為斷言添加描述 376 20.3 將 assertTrue 遷移到特定斷言 377 20.4 用真實對象替換模擬對象 379 20.5 優(yōu)化通用斷言 382 20.6 移除不穩(wěn)定的測試 383 20.7 更改浮點數(shù)斷言 385 20.8 將測試數(shù)據(jù)改為真實數(shù)據(jù)386 20.9 保護違反封裝的測試 .389 20.10 移除不相關的測試信息 .391 20.11 在每個合并請求中添加覆蓋率 393 20.12 根據(jù)日期重寫測試 394 20.13 學習一種新的編程語言 .396 第21 章 技術債務 399 21.0 引言 399 21.1 移除依賴于生產環(huán)境的代碼 400 21.2 移除缺陷跟蹤器 402 21.3 移除警告/ 嚴格模式關閉 403 21.4 預防和移除 ToDo 和 FixMe 405 第22 章 異常 407 22.0 引言 407 22.1 刪除空的異常塊 407 22.2 刪除不必要的異常 409 22.3 重寫預期情況下的異常 411 22.4 重寫嵌套的try/catch 塊 412 22.5 用異常替換返回代碼 .414 22.6 重寫異常箭頭代碼 416 22.7 隱藏終端用戶的低級錯誤418 22.8 縮小異常范圍 419 第23 章 元編程 423 23.0 簡介 423 23.1 移除元編程用法 424 23.2 實例化匿名函數(shù) 428 23.3 移除預處理器 430 23.4 移除動態(tài)方法 431 第24 章 類型 435 24.0 引言 435 24.1 移除類型檢查 435 24.2 處理真值 437 24.3 將浮點數(shù)改為小數(shù) 441 第25 章 安全性 443 25.0 引言 443 25.1 輸入過濾 443 25.2 更改順序ID 445 25.3 移除包依賴 .447 25.4 替換惡意正則表達式 .449 25.5 保護對象反序列化 450 術語表 453
|