代碼整潔之道.PDF 下載 代碼整潔之道.PDF 中文版 高清 PDF 電子書下載 代碼整潔之道下載
如何保持代碼整潔
在明白了代碼整潔的意義之后,如何保持代碼整潔就是當前最緊迫的問題。私以為可以從幾個點來進行考慮:
意識
首先便是要有保持代碼整潔的意識,我很喜歡《代碼整潔之道》中反復提到的一條童子軍軍規:讓營地比你來時更干凈。我認為有保持代碼整潔的意識並不是說從寫代碼的時候就一直是整潔的,如果能夠這樣當然很好,但是這很難做到。在一開始編寫代碼的時候我們可以按照自己的思維順序,個人習慣,甚至是只是為了追求想要可以工作的代碼來寫出一些較為混亂的代碼,但是在結束當前的工作之前,在讓自己的大腦脫離開之前,一定要整理代碼,一定!
明天的你與今天的你總會有所不同,在再次進入工作之后,你或許會忘記很多的細節,而混亂的代碼只會讓思維更加的混亂。所以趁着你的思維還沒有與你代碼中巧妙的實現斷線之前,整理你的代碼,使代碼盡可能的保持整潔。這便是我理解的童子軍軍規,你可以把營地搞得一團糟,但在你離開之前,一定要整理的更加干凈。
代碼規范
從代碼規范入手是最基礎也是最容易實現的保持代碼整潔的方式。從幾個方面來體現代碼形式的整潔:足夠好的命名,簡單專注的函數,有意義的注釋以及規范的代碼格式。
一個好的命名可以幫助讀者快速的理解變量以及函數的意義,所要實現的事情是什么。很多時候程序員寧願花費更多的時間在變量名后加一些注釋,也不願意取一個簡單易懂的名字,這實際是一件本末倒置的做法。一個函數、變量、類或者接口應該只通過命名就可以把它所做的事情傳達給讀者。所以不要害怕花費時間在思考命名上。
函數應該做一件事。做好這件事。只做這一件事。這句話摘選自函數這一章節。這句話很重要,我總會在函數中看到比函數名描述的更多的事情,有的時候我不得不花時間去閱讀一些我不想了解的實現細節才能明白這個函數到底做了一件什么事。所以一個函數只做一件事,這是我認為很容易達到卻又很容易被忽略的非常重要的事情。同時,函數還應該盡可能的短小,一個函數就算寫的再清晰,如果一下子展示出100多行,那種龐大的行數也會讓讀者瞬間放棄。當然我相信,如果一個函數只專注於一件事,是不會產生過於龐大的代碼量的。所以我認為,一個好的代碼,應該像洋蔥一樣,可以一層一層的剝開,由粗略到細致。而不是像一個煮雞蛋,完全一整個,讓人無法一點一點的理解。
關於有意義的注釋,我想我在前邊兩段的描述已經傳達了一個信息,注釋或許並不那么必要。如果編程語言足夠有表現力,能夠傳遞給讀者所要表達的信息,注釋其實就失去了意義。只在真正需要的地方寫代碼才是注釋應該存在的意義。
好的代碼格式,例如縮進的形式,可以有力的將層級結構傳遞給讀者。我很討厭沒有縮進的代碼,因為我根本記不住哪個}是哪個{的結束。有的時候,代碼格式也是一種有力的信息。
質量保證
所謂質量保證,便是指可運行的自動化測試以及代碼中的錯誤處理。測試與錯誤處理代碼的整潔常常被人們所忽略,或者不止是整潔,連測試和錯誤處理本身都常常是會被忽略的事情。事實是,測試很好的保證了我們的代碼質量,給了我們對代碼修改的信心,這是另一個話題了,這里不做贅述。
錯誤處理是指在代碼中程序員常常為了覆蓋更多的情況、給出更多的錯誤信息而在代碼的前后加try catch。設想一個極端的情況,每一行代碼都被一個try catch包圍,整個結構就已經一團糟了,再清晰的結構這個時候也已經被拆解的支離破碎。錯誤處理可以匯總到某一處集中處理,不要讓隨處添加異常處理破壞代碼的邏輯。
除了異常處理,測試的整潔同樣重要。測試與編程語言一樣,也是一種向讀者傳遞實現內容的一種方式,隨着代碼的衍進,測試也同樣在進行着改變。所以測試代碼的整潔和生產代碼的整潔同樣重要。一團糟糕的測試代碼或許可以保證代碼的質量,但當代碼產生變動時,對於測試代碼的改動或許比對生產代碼的改動所花時間還要長,我們需要花費更大的代價去維護測試代碼,這是一件得不償失的事情。為了不讓這類事情發生,需要對測試代碼的整潔與生產代碼的整潔給予同樣的重視。同方法的職責單一原則一致,斷言的內容也需要職責單一。每個斷言應該只判斷一件事。如此便可以更好的幫助我們快速精准的定位問題。
分層與結構
分層是指代碼從整體上,由上至下的一種層級結構應該是清晰的,並且一層一層應該很好的區分開。與分層平級的便是結構,結構是指從業務邏輯上,各個模塊應該很好的區別開。分層與結構的構建清晰與否極大的影響了整個項目的整潔程度。
從大的方面來說,系統的使用與構造需要明確的區分開,才不會將整個結構混雜在一起。與此同時,決定了系統的數據流走向便是決定了整個系統的層級划分,不同的層級也需要明確的區分開來。從小一些的方面來看,當創建一個類時,類的職責也需要明確,一個類應該只有一個職責。以上這些無論大的或是小的方面,之所以都需要明確划分職責,都是為了更好的實現內聚。
內聚代表着職責的專一,這是整潔的一個很重要准則。當我們實現內聚的時候,便會很自然的存在一個分類的界限。舉個可能並不是很恰當的例子,學校里有很多學院,每個學院有很多專業,每個專業有很多班,每個班里有很多學生,這樣層層遞進,每一層也分的很清楚,每一層的結構也很清晰。如果換一種說法呢,還是學校,學校里有很多學生1、2、3,有專業1、2、3, 有學院1、2、3。這樣的話,學校還是那個學校,分層完全沒有體現,有的更糟糕的,還會把不同層級、不同結構混合在一起。
所以好的結構和層級的划分可以認為是一種邏輯上的整潔,是相對更加抽象的代碼整潔,要求程序員自上而下地來進行代碼的整潔。
如何整理代碼
說完如何保持整潔的代碼,如果遇到了一團混亂的代碼,我們要如何將它整理的井井有條呢?首先我們要能夠明確的找到混亂地方,當然我們不太可能一下子就找到所有,不用太着急,我們就要像剝洋蔥一樣一點一點的拆解代碼,小幅的進行改動。每次改動,都有前邊提到的測試來保證我們並沒有破壞現有的功能。
當我們要整理一大坨代碼的時候,我自己的經驗是,如果不知道如何改動的時候,可以先從最基本的入手,看懂一段代碼並且明確這是做了一件事之后,提取出來,取一個具有描述意義的名字。當將代碼這樣拆解成一個一個的方法之后,結構就清晰了很多。之后我們就會聞到很多的code smell,發現很多的重復。關於如何發現和解決code smell,可以參考《重構》這本書,這本書列舉了很多的code smell,並且給出了很好的解決方案。
小幅的、迭代式的進行代碼的改動可以幫助我們一點一點的梳理結構,朝着更清晰的方向行走。同時千萬不要忘記每一次的改動都需要運行測試來保證我們做的是對的事情。