ADZ 學習筆記

Ruby/Rails, Startup, Life

rails 筆記 - 用 gem 包裝 business logic 的構想

| Comments

最近做的一個遊戲平台專案,需要拆成三個 rails application,除了 models 的 scope 和 virtual attributes 在不同 application 會有一點點差異外,其他的商業邏輯包含 forms & validations, service objects, shared concerns, libraries, 還有一部分的 i18n 都是一樣的。

在剛開始進行專案的時候,只寫在 lib/ 內,不過慢慢開始出現一些奇怪問題:

  1. 三個專案用同一個 database,那 migration 要寫在哪?
  2. 三個專案都有同一份 forms / services 那 test 要寫在哪?
  3. 每次修改其中一個專案就要 copy 來 copy 去非常不方便。

如果專案持續擴充會出現更多維護上的問題,於是這幾天參考一些 gem 的設計 rails, devise, sidekiq-web, public_activity, settingslogic ...

初步構想是:

  1. 把所有共用的 library, concerns 搬到 gem 內
  2. 把共用的 models / forms / service 搬到 gem 內,但不使用 gem 的 namespace
  3. 把共用 i18n files 搬到 gem 內,使用的專案會一併載入
  4. 把 migration file 移到 gem 內 (由使用的專案決定需不需要 include 這些 migration files)
  5. 把 test 移到 gem 內
  6. models 的小差異,在 gem 內透過 DSL 預先定義,由使用的 app 決定要載入哪個環境的 models

目的是要讓 application 的工作降低成只負責 組織流程,而 test 部分只須要寫 integration test 確保流程操作是正確的。

而 gem 則變成一個 application engine。裡面的 test 則是大小不一的 integration test & unit test 須確保資料存取的正確性。

這樣的好處是,以後需要同樣的資料儲存架構,只需要使用該 gem 就能組織出新的 application (參考自 devise),甚至把流程抽象化,也許能發展到透過定義的方式組織流程。

Comments

comments powered by Disqus