iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 2
1
自我挑戰組

rails 學習紀錄系列 第 2

[Day2] 關於PORO(Plain Old Ruby Object)

什麼是PORO ?

簡單的沒有任何繼承關係的純Ruby物件

  • 可以讓Model和Controller代碼能夠更加精簡,讓一個 class 只需要負責一件事,達到 Single Responsibility Principle,還可增加彈性、容易重複使用並且容易測試。
  • PORO也可以實現類似model的功能,有些數據不需要儲存到數據庫,可以用PORO代替 (ex 購物車測試的Cart Model)
  • 一些運算邏輯不屬於model範疇,例如流程控制或是牽涉到其它model,應該要切出另一個非ActiveRecord(PORO)的class來處理。

PORO要放在哪?

  1. 當業務邏輯是為了一個特定的領域用途(Printing, Library & etc.)並且和已有的model上下文無關,應該使用PORO(Plain Old Ruby Objects)類,並且可以放到app/models/some_directory目錄。
  2. 所有/app下的代碼都會在app啓動時自動加載,PORO也可以放到app/models/concerns和app/controllers/concerns目錄。
  3. 如果一些PORO, Modules或者Classes跟具體應用無關(application independent),並且可以用於其他應用,請放到/app/lib目錄下。
  4. using namespaced classes and modules , 你需要做的就是,創建一個和model或controller有同樣名字的目錄,把所有PORO文件放到對應的目錄中去。當我們使用時,不需要在類的前面寫命名空間。你有更簡短的代碼和更有組織邏輯的目錄結構。
    請參考HI, I'M PORO裡範例
AwesomeProject   
├──app
│  ├─controllers
│  │ ├─registration_controller
│  │ │ └─registration_service.rb  #這個是PORO
│  │ └─registration_controller.rb
│  ├─models
│  │ ├─settlement
│  │ │ └─month_of_year.rb    #這個是PORO
│  │ └─settlement.rb
│  └─views
│
└─lib

文章參考來源
Rails 程式碼整理術(進階)
Rails 你好,我是 PORO
14条Rails最佳实践


上一篇
[Day1] 關於我誤解Model的那些事
下一篇
[Day3] 關於 index: true 和 foreign_key: true
系列文
rails 學習紀錄14

尚未有邦友留言

立即登入留言