Laravel 代碼簡(jiǎn)潔之道(12-22)
12、避免使用助手類
有時(shí)候人們會(huì)使用類來(lái)歸類助手函數(shù),可要小心了,這可能會(huì)讓代碼變得更混亂。常見(jiàn)的做法是定義一個(gè)只包含一個(gè)作為助手函數(shù)使用的靜態(tài)方法的類。更好的做法是將這些方法放入具有具體邏輯的類中,或者是只將它們當(dāng)做是全局函數(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、拿出一個(gè)周末來(lái)學(xué)習(xí) OO
了解靜態(tài)(static)/ 實(shí)例(instance)方法和變量,還有私有的(private)/ 保護(hù)的(protected)/ 公共的(public)之間的可見(jiàn)性的區(qū)別。還要了解 Laravel 如何使用魔法方法。當(dāng)你是初學(xué)者的時(shí)候可能不會(huì)很常用,但是隨著你的編碼水平增長(zhǎng),這些是至關(guān)重要的。
14、不要在類中只寫過(guò)程代碼
這將前面的推文與此處的其他提示聯(lián)系起來(lái)。OOP 的存在就是為了讓你的代碼更加具有可讀性,請(qǐng)使用 OOP。不要再在控制器中寫好幾百行的過(guò)程代碼了。
15、閱讀 SRP 之類的內(nèi)容,并進(jìn)行合理的擴(kuò)展
避免使用那種處理很多和當(dāng)前類不相關(guān)邏輯的類,但是也不要為每件事都創(chuàng)建一個(gè)類。你是為了寫干凈的代碼,而不是想在每件事上都做分離。
16、避免函數(shù)中參數(shù)過(guò)多
當(dāng)您看到具有大量參數(shù)的函數(shù)時(shí),它可能意味著:
- 該函數(shù)包含太多職責(zé),應(yīng)該分離。
- 職責(zé)沒(méi)問(wèn)題,但你應(yīng)該學(xué)會(huì)重構(gòu)他的長(zhǎng)簽名.
以下是修復(fù)第二種情況的兩種策略.
17、使用數(shù)據(jù)傳輸對(duì)象 (DTO)
與其以特定順序傳遞大量參數(shù),不如考慮創(chuàng)建一個(gè)具有屬性的對(duì)象來(lái)存儲(chǔ)這些數(shù)據(jù)。 如果您發(fā)現(xiàn)某些行為可以移入此對(duì)象,則可以加分。
// 糟糕的示例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)建流式對(duì)象
你可以使用流式 API 來(lái)創(chuàng)建對(duì)象。使用單獨(dú)的方法調(diào)用來(lái)逐漸添加數(shù)據(jù),并且只要構(gòu)造函數(shù)中的絕對(duì)最小值。正是因?yàn)槊總€(gè)方法都返回 $this ,你可以在任意一次調(diào)用后讓整個(gè)流程停下來(lái)。
Visit::make($url, $routeName, $routeData) ->withCampaign($campaign) ->withTrafficSource($trafficSource) ->withReferer($referer) // ... 等等
19、使用自定義集合
創(chuàng)建自定義集合可以更好地寫出更富有表現(xiàn)力的語(yǔ)法。參考這個(gè)訂單合計(jì)的示例:
// 壞的$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、不要使用縮寫
不要覺(jué)得很長(zhǎng)的變量名 / 方法名就是不對(duì)的,才不是這樣,它們很有表現(xiàn)力。使用一個(gè)長(zhǎng)的方法名比短的更好,配合查閱文檔能更完整地了解它的功能。變量也是如此。不要使用無(wú)意義的幾個(gè)字母的縮寫。
// 壞的$ord = Order::create($data);// ...$ord->notify();
// 好的$order = Order::create($data);// ...$order->sendCreatedNotification();
21、嘗試在控制器中只使用 CURD 動(dòng)作
如果可以的話,只使用控制器中的 7 個(gè) CURD 動(dòng)作,通常來(lái)說(shuō)會(huì)更少。不要在控制器中創(chuàng)建 20 多個(gè)方法,更短的控制器更好一些。
22、使用更具有表現(xiàn)力的方法名稱
考慮「這個(gè)對(duì)象可以完成什么事情」,而不是「這個(gè)對(duì)象能做什么」。也會(huì)有例外,比如操作類。這是個(gè)很好的經(jīng)驗(yàn)。
// 壞的$gardener->water($plant);$orderManager->lock($order);// 好的$plant->water();$order->lock();