Laravel 代碼簡潔之道(12-22)
12、避免使用助手類
有時候人們會使用類來歸類助手函數(shù),可要小心了,這可能會讓代碼變得更混亂。常見的做法是定義一個只包含一個作為助手函數(shù)使用的靜態(tài)方法的類。更好的做法是將這些方法放入具有具體邏輯的類中,或者是只將它們當做是全局函數(shù)。
// 壞的class Helper{ public function convertCurrency(Money $money, string $currency): self { $currencyConfig = config("shop.currencies.$currency"); $decimalDiff = ... return new static( (int) round($money->baseValue() * $currencyConfig[value] * 10**$decimalDiff, 0), $currency ); }}// 使用use AppHelper;Helper::convertCurrency($total, 'EUR');
// 好的class Money{ // 其他的 money/currency 邏輯 public function convertTo(string $currency): self { $currencyConfig = config("shop.currencies.$currency"); $decimalDiff = ... return new static( (int) round($this->baseValue() * $currencyConfig[value * 10**$decimalDiff, 0), $currency ); }}// 使用$EURtotal = $total->convertTo('EUR');
13、拿出一個周末來學習 OO
了解靜態(tài)(static)/ 實例(instance)方法和變量,還有私有的(private)/ 保護的(protected)/ 公共的(public)之間的可見性的區(qū)別。還要了解 Laravel 如何使用魔法方法。當你是初學者的時候可能不會很常用,但是隨著你的編碼水平增長,這些是至關重要的。
14、不要在類中只寫過程代碼
這將前面的推文與此處的其他提示聯(lián)系起來。OOP 的存在就是為了讓你的代碼更加具有可讀性,請使用 OOP。不要再在控制器中寫好幾百行的過程代碼了。
15、閱讀 SRP 之類的內(nèi)容,并進行合理的擴展
避免使用那種處理很多和當前類不相關邏輯的類,但是也不要為每件事都創(chuàng)建一個類。你是為了寫干凈的代碼,而不是想在每件事上都做分離。
16、避免函數(shù)中參數(shù)過多
當您看到具有大量參數(shù)的函數(shù)時,它可能意味著:
- 該函數(shù)包含太多職責,應該分離。
- 職責沒問題,但你應該學會重構他的長簽名.
以下是修復第二種情況的兩種策略.
17、使用數(shù)據(jù)傳輸對象 (DTO)
與其以特定順序傳遞大量參數(shù),不如考慮創(chuàng)建一個具有屬性的對象來存儲這些數(shù)據(jù)。 如果您發(fā)現(xiàn)某些行為可以移入此對象,則可以加分。
// 糟糕的示例public function log($url, $route_name, $route_data, $campaign_code, $traffic_source, $referer, $user_id, $visitor_id, $ip, $timestamp){ // ...}
// 推薦的示例public function log(Visit $visit){ // ...}class Visit{ public string $url; public string $routeName; public array $routeData; public string $campaign; public array $trafficSource[]; public string $referer; public string $userId; public string $visitorId; public string $ip; public Carbon $timestamp; // ...}
18、創(chuàng)建流式對象
你可以使用流式 API 來創(chuàng)建對象。使用單獨的方法調(diào)用來逐漸添加數(shù)據(jù),并且只要構造函數(shù)中的絕對最小值。正是因為每個方法都返回 $this ,你可以在任意一次調(diào)用后讓整個流程停下來。
Visit::make($url, $routeName, $routeData) ->withCampaign($campaign) ->withTrafficSource($trafficSource) ->withReferer($referer) // ... 等等
19、使用自定義集合
創(chuàng)建自定義集合可以更好地寫出更富有表現(xiàn)力的語法。參考這個訂單合計的示例:
// 壞的$total = $order->products->sum(function (OrderProduct $product) { return $product->price * $product->quantity * (1 $product->vat_rate);});
// 好的$order->products->total();class OrderProductCollection extends Collection{ public function total() { $this->sum(function (OrderProduct $product) { return $product->price * $product->quantity * (1 $product->vat_rate); }); }}
20、不要使用縮寫
不要覺得很長的變量名 / 方法名就是不對的,才不是這樣,它們很有表現(xiàn)力。使用一個長的方法名比短的更好,配合查閱文檔能更完整地了解它的功能。變量也是如此。不要使用無意義的幾個字母的縮寫。
// 壞的$ord = Order::create($data);// ...$ord->notify();
// 好的$order = Order::create($data);// ...$order->sendCreatedNotification();
21、嘗試在控制器中只使用 CURD 動作
如果可以的話,只使用控制器中的 7 個 CURD 動作,通常來說會更少。不要在控制器中創(chuàng)建 20 多個方法,更短的控制器更好一些。
22、使用更具有表現(xiàn)力的方法名稱
考慮「這個對象可以完成什么事情」,而不是「這個對象能做什么」。也會有例外,比如操作類。這是個很好的經(jīng)驗。
// 壞的$gardener->water($plant);$orderManager->lock($order);// 好的$plant->water();$order->lock();