變數

變數就像小孩一樣,生的越多負擔越大

程式碼多半會髒,大概有八成是因為變數太多了。變數多會延伸出幾個問題:

  • 命名會變困難,因為簡單的單字可能都被使用

  • 變數會長大,也會有叛逆期。同一個變數經歷過幾個不同階段的迴圈以及 by reference 的修改,這支變數充滿了未知數。

  • 如果不只一個變數再重複利用,還有多個變數時,就會直接照成可怕的耦合。這大概就像延長線上的所有電線打結的樣子,你必須要順著頭或尾一步一步的解開這條線的來龍去脈。

先舉一個待解決的例子(這個案例算是非常輕微):

<?php
// bad code
function example () {
    $result = [];
    $products = [];
    $disabledProductIds = [];
    // 透過 by reference 更新變數資料
    $this->getProducts($products);
    foreach($products as $key => $product) {
        // 移除狀態為 false 的商品
        if ($product->status === false) {
            unset($products[$key]);
            $disabledProductIds[] = $product->id;
            continue;
        }
        // 商品名字加上原本索引
        $product->name .= "($key)";
    }

    $products = array_value($products);
    $result['products'] = $products;
    $result['disabled_ids'] = $disabledProductIds;

    return $result;
}

總共養了三支變數,當中 $products 還有 by Reference 的方式更新,接著又使用 unset 移除資料。

這個範例會對於之後的維護和擴充產生幾個問題:

  • 當要對 $products 操作的時候,要從頭 dd($products) 這個變數來確定應該怎麼寫改。

  • 如果要知道這個功能最後輸出什麼結果,就必須要 dd($result),這還只能勉強猜到變數的內容,因為難保之後會不會有人從中間選擇性寫入其他值。

減少變數的方法有兩種:

  • 將變數丟到新的類別或方法去處理,但會分散邏輯

  • 使用 fluent interface 去解,Laravel Collection 就能很漂亮的解套了


減少未知的變數

如果最後輸出的變數是陣列或 Collection,建議重新 Map 一次,可以有效減少未知的部分,還能集中程式碼邏輯。

Last updated

Was this helpful?