Debugging collections(譯)

lcoding發表於2019-02-16

注:本文是翻譯Freek Van der Herten寫的關於Collection
除錯技巧,,讀完以後很實用,分享給大家.閱讀過程中,翻譯有錯誤的希望大家指正,thx..
原文連結: https://murze.be/2016/06/debu…

最近我一直在使用Laravel的collection,如果你還不瞭解collection,我簡單說下:一個collection(集合)就是一個‘功能強大’的陣列,有很多強大處理其內部資料的函式.但是唯一讓我頭疼的地方是如何除錯collection的鏈式操作,以下是我改善過的業務處理.

使用Collection類你可以使用鏈式的方式,通過操作函式來處理資料,舉個例子如下(為了讓程式碼更簡短,我把函式體中的具體實現給省略了)

collect($items)
  ->filter(function() { 
     ... 
   })
   ->unique(function() { 
      ... 
   })
   ->map(function() {
     ... 
   })
   ->sortBy(function() { 
      ...
   });

想象一下如果你需要除錯這段程式碼,你想要獲取map函式的返回值,你會怎麼做?那麼你可能會用dd()把這`整個操作`包起來,得出返回值.

 dd(collect($items)
      ->filter(function() { 
         ... 
       })
       ->unique(function() { 
          ... 
       })
       ->map(function() {
         ... 
       }))
       ->sortBy(function() { 
          ...
       });

的確,這樣足夠了,整個操作的返回值也能列印出來,但是還是有點瑣碎,你必須要要在每次測試操作的開始和結尾加點東西(開頭:`dd(`,結尾:`)`),我覺得這樣可讀性上不太好.並且移動dd語句測試也是很麻煩,結尾的括號又特別容易被忽略,so,雖然我看似解決了這個問題,但是我敢保證如果像這樣除錯的話,你很快就覺得很繁瑣.ok,其實是有解決方案的.

laravel的Collection類是Macroable(暫且譯為:可擴充套件的),這意味著我們可以在執行時新增相應的函式.為了提高我們除錯流程,我們可以建立簡單的dd macro:

Collection::macro(`dd`, function () {
    dd($this);
});

為了能在專案中使用這個函式,需要將以上程式碼放到服務提供者中.ok,如下,看下這個Blender–我們的laravel模板,舉個例子

使用macro debugging除錯Collection,對於我們來說變得很簡單了.ok,我們來看看它如何使用.

collect($items)
  ->filter(function() { 
     ... 
   })
   ->unique(function() { 
      ... 
   })
   ->map(function() {
     ... 
   })
   ->dd()
   ->sortBy(function() { 
      ...
   });

為了測試特定鏈式操作的返回值,你可以將`->dd()`放到該操作的最後即可,這樣一來,相比較直接`dd(….)`,可讀性就高了.在完成除錯後,我們只需把鏈式操作尾部的程式碼去掉即可.還有你可用使用PHPStrom的快捷鍵`alt+shift+arrow-up` 和`alt+shift+arrow-down`可以將`->dd()`部分更方便移到前一個或下一個鏈式操作之後.

結語

你還可以去看Laravel的官方文件和Refactoring to Collection

試讀篇章中文版:Refactoring to Collection

相關文章