使用案例與服務 - Rails 開發實踐
Entity(實體) 和 Aggregate(聚合) 是商業邏輯的基礎要素,我們將資料轉換成有意義的資訊,若要討論到該如何運用這些資料,那麼就屬於 Service(服務)和 Use Case(使用案例)的負責的部分。
服務
如果已經對 Ruby on Rails 有一定的熟悉程度,那麼應該會聽過 Service Object(服務物件)的概念,實際上這種物件所指的就是 Service 所負責的任務。
在過去的 Ruby on Rails 中曾經有過 Fat Model 的概念,就是盡可能把所有邏輯集中在 Model 中。然而在複雜的系統下,會讓 Model 變得難以維護,若是我們繼續細分,在 Model 層級下大致上能區分出以下幾種:
- Value Object(值物件)
- Entity(實體)
- Aggregate(聚合)
- Service(服務)
這幾類物件基本上就是構成商業邏輯的部份,也是為什麼在 Rails 的文章中通常會說「把商業邏輯放到 Model 中」的原因。
Entity 和 Aggregate 負責維護狀態的改變,那麼 Service 負責的就是協調不同物件和背後邏輯的任務,在訂閱機制中我們就用來進行「確認訂閱狀態」以及「更新訂閱狀態」的處理。
使用案例
在大多數時候 Entity、Service 都是一些零散的物件,要將這些物件組織起來構成一個完整的流程就是 Use Case(使用案例)所負責的任務,以「建立訂閱」作為例子,我們要完成訂閱相關的事務處理,需要完成以下任務。
- 檢查訂閱狀態
- 建立新的訂閱
- 保存訂閱狀態
在 Model 層級下的概念,會由 Service 來處理其中某幾項任務,因此在比較複雜的使用案例中可能會有許多 Entity、Aggregate、Service 在這之中互相協作來達成任務,甚至會有需要跨越邊界的狀況發生,因此我們會在 Use Case 的層級下協調這些物件完成任務。
除此之外,我們應該將系統視為「不存在隨機」的方式下去設計,在這樣的狀況下像是「現在時間」這類資訊,就會在 Use Case 中被確定,後續的商業邏輯(Model 層級)都會以參數的方式接受這些資訊,來避免「無法確定」的結果出現。
如果對這篇文章有興趣,可以透過以下連結繼續閱讀這系列的其他文章。
- 前言 - Rails 開發實踐
- 將需求實現的準備 - Rails 開發實踐
- 獲取規格的技巧 - Rails 開發實踐
- 可以測試的規格 - Rails 開發實踐
- 快速通過測試的方法 - Rails 開發實踐
- 用測試完善規格 - Rails 開發實踐
- 資料跟資訊的差異 - Rails 開發實踐
- 用測試資料驗證邏輯 - Rails 開發實踐
- 預期外狀況的檢查 - Rails 開發實踐
- 預期外狀況的測試 - Rails 開發實踐
- 聚合多筆資料 - Rails 開發實踐
- 重構與修正邏輯 - Rails 開發實踐
- 加入聚合實體 - Rails 開發實踐
- 持久化資料 - Rails 開發實踐
- 實體與倉庫 - Rails 開發實踐
- 聚合與邊界 - Rails 開發實踐
- 使用案例與服務 - Rails 開發實踐
- 結語 - Rails 開發實踐