Nic Lin's Blog

喜歡在地上滾的工程師

Service Object 使用時機

為何要使用Service Object:

顧名思義,Service Object是因為有某些類似的特定功能,像是一個『service』,跟資料庫中的model並無直接關係,因此拉出來獨立成為一個class,在邏輯上會更容易管理。不過在文章中有定義了幾個需要使用service object的情況:

  • method邏輯極其複雜的時候
  • 跨Model使用,無法特別歸類於特定Model
  • 與外部服務有較多關連
  • 並非重要功能
  • 同一種method有許多類似的使用方法

Service Object 使用時機

以登入機制為範例,將登入的authenticate功能另外放在UserAuthenticator這個class當中,非常簡單的一個介紹。但通常在實作中會遇到的情況都複雜許多:

實作規格:

  1. Group、Post、Comment 三個model
  2. 要能將Post輸出成四種格式:html、json、xlsx、pdf
  3. 在每種格式中要能列出相對應Group和Comment,並依據數量畫出圖

聽起來就需要非常多分門別類的功能,但應該不難看出,這些功能幾乎都是使用外部服務,包括gem ‘jbuilder’ (https://github.com/rails/jbuilder)、gem ‘axlsx’ (https://github.com%20/randym/axlsx)、gem ‘prawn’ (https://github.com/prawnpdf/prawn)、gem ‘gruff’ (https://github.com/topfunky/gruff) 四個都是不需要自己土法煉鋼的功能,而是直接使用gem安裝以後,就可以將格式輸出了。

因此,這些內容都是專門處理『輸出』(render)的部份,可以將他們收攏為一個service object,管理比較方便。

comments powered by Disqus