(譯)保持你的程式碼整潔

飛翔的大象發表於2019-03-08

我在座位上安頓下來,與我的團隊成員一起解決問題。我說"我們必須贏的這場比賽"。在兩天內埋頭開發一個工作原型,大家的好勝心都被激發,都在爭奪前三名。

幾分鐘後,其中的一個高階工程師走到我的辦公桌前,臉上露出一絲不滿,喃喃自語:你的程式碼不清晰,很亂!這是我邁向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定義的物件導向程式設計的前五個原則的首字母縮寫。使用這些原則,你可以編寫低耦合、高內聚和封裝很好的程式碼。這些原則密切相關。

不要太為難自己

想知道這一點為什麼這個在名單上?陷入清潔程式碼的世界是很容易,想要一天吸收一切。悲傷的是:需要時間,數月,數年和奉獻精神。必須學習和實踐這些原則,但這一切都始於決定讓事情變得更加清潔。

相關文章