- 此為翻譯文章
- 原文連結
我在座位上安頓下來,與我的團隊成員一起解決問題。我說"我們必須贏的這場比賽"。在兩天內埋頭開發一個工作原型,大家的好勝心都被激發,都在爭奪前三名。
幾分鐘後,其中的一個高階工程師走到我的辦公桌前,臉上露出一絲不滿,喃喃自語:你的程式碼不清晰,很亂!這是我邁向clean code旅程的開始。
clean code?嗯,這對於我來說並不奇怪,但是如果程式碼正常工作,這真的很重要嗎。是的,它確實很重要,一千次。
在這次活動之前,我曾擔任幾年的軟體工程師。我已經構建了應用,但是我剛剛被告知了讓我程式碼不一樣的東西。
我的問題很簡單:我專注於完成工作,目的是編寫有效的程式碼,反過來又招致了技術債務。
clean code 的方式
當你讀完clean code的所有章節時,就不會發生這種情況。它需要知識和不斷的實踐,你必須學習原理,模式和實踐。這是艱苦的工作需要數年,但你可以從今天開始。
無論你怎麼去clean你的code,總有一件或兩件你能學到的事情使code變得更乾淨。
學習的最佳方式之一是閱讀專家的書籍或者帖子,你應該在你的twitter中有他們的推特流,聽取他們的交談,在github上follow他們,學習他們的程式碼是如何寫和組織的。
Your growth is limited as an engineer if you do not constantly learn from experts in your field.
保持你的函式短小精悍
這可能是1337篇文章中的一篇,來強調保持函式儘可能短,人們很容易在這裡弄錯。
clean code不僅僅是寫短的方法,而是編寫清晰表達意圖的程式碼。
當一個函式太長了,這說明它做的太多了,閱讀者可能會無法完全解讀它的功能,一個函式應該做一件事。
if($order->contains($status){
//do something with order
}
function contains($status){
$order_statuses=['accepted','delivered','rejected','processed'];
if (in_array($status, $order_statuses)) {
return true;
}
return false;
}
複製程式碼
我們可以重寫它來使contains更清楚:
function contains($status){
return in_array($status, $this->config->statuses);
}
複製程式碼
現在,contains不僅僅更簡短,而且還能解耦。
變數和函式名字肯以體現其功能
為函式命名是乏味的,但是這絕對物有所值。當程式碼改變時,你可以不用更新註釋。
$date =date('Y-m-d'); //Ofcourse, it's a date but too generic!
$orderCreationDate =date('Y-m-d'); //cleaner code
複製程式碼
避免使用if和switch
就個人而言,我花了一段時間來掌握這一點。你怎麼能告訴我避免我的最愛呢?事實上,大多數的條件語句可以很容易的提取到單獨的函式和類中。這並不是說你永遠不應該使用if和switch語句,但在某些情況下可以避免。
這有一個很好的例子:
class BookOrder
{
public function process()
{
switch ($this->book->type) {
case 'audiocopy':
return $this->processAudioBook();
break;
case 'downloadablecopy':
return $this->processDownloadableCopy();
break;
case 'paperbookcopy':
return $this->processPaperBookCopy();
break;
default:
}
}
}
複製程式碼
更整潔、更易於維護的方法是:
interface IBookOrder {
public function process();
}
class AudioBookOrder implements IBookOrder :void {
public function process()
{
// TODO: Implement process() method.
}
}
class PaperBookOrder implements IBookOrder: void {
public function process()
{
// TODO: Implement process() method.
}
}
class DownloadableBookOrder implements IBookOrder: void {
public function process()
{
// TODO: Implement process() method.
}
}
複製程式碼
避免心理對映
clean code應該是更易於閱讀,理解並且不應該留下任何猜測空間。
It is not the language that makes a program look simple, but the programmer who makes the language appear simple. Robert C. Martin
以下程式碼檢查客戶能否可以提取一定數額的資金,它有效但是很亂。
if($this->user->balance > $amount && $this->user->activeLoan===0){
$this->user->balance -=$amount; // withdraw amount;
}
複製程式碼
讓我們把它變得更清晰:
if($this->hasNoActiveLoan() && $this->canWithdrawAmount($amount)){
$this->withdraw($amount);
}
public function hasNoActiveLoan(){
return $this->user->activeLoan===0;
}
public function canWithdrawAmount(float $amount){
return $this->user->balance > $amount;
}
public function withdraw(float $amount){
$this->user->balance -=$amount;
}
複製程式碼
這不僅僅更容易理解而且更容易測試了。
理解和應用S.O.L.I.D原則
S.O.L.I.D是由Robert C Martin定義的物件導向程式設計的前五個原則的首字母縮寫。使用這些原則,你可以編寫低耦合、高內聚和封裝很好的程式碼。這些原則密切相關。
不要太為難自己
想知道這一點為什麼這個在名單上?陷入清潔程式碼的世界是很容易,想要一天吸收一切。悲傷的是:需要時間,數月,數年和奉獻精神。必須學習和實踐這些原則,但這一切都始於決定讓事情變得更加清潔。