2012-10-17 22 views
0

我有一個ActiveRecord模型Reservation
它達到了這樣一個程度,即班級規模很大,而且做得太多。
我想將其拆分成幾個不同的模塊,並將它們放在Reservation模塊下。重組龐大的類

不幸的是,這會打破應用程序。

這時我看到以下選項:

  • 它命名爲類似ReservationConcerns或類似
  • 添加功能到Reservation類本身,但在物理上它移動到子目錄(Reservation將是app/models/reservation.rbReservation::Pipeline將在app/models/reservation/pipeline.rb等)。

所以,問題是如何構造不同的關注點的特徵已經有它作爲一個單一的,體積龐大類沒有打破應用。

+0

爲什麼特別是應用程序中斷?有沒有什麼可以阻止您更改Reservation類和與它接口的代碼? – willglynn

+0

應用程序的其餘部分與'Reservation'接口,所以我想保留它以避免更改應用程序中的現有約定(因此不要打破它)。只是重構實施。 –

回答

0

如果你想分裂出一個Ruby類成不同的組件,而不改變其公共接口,一個解決方案是使用模塊:

# app/models/reservation.rb 
class Reservation < ActiveRecord::Base 
    # associations, validations, etc. 

    include Pipeline 
end 

# app/models/reservation/pipeline.rb 
module Reservation::Pipeline 
    def some_pipeline_method 
    # ... 
    end 

    def other_pipeline_method 
    # ... 
    end 
end 

的ActiveRecord還提供observers,這「是降低的好方法當模型類負擔的功能與該類的核心責任無關時,通常會出現混亂。「觀察員經常大量使用ActiveModel::Dirty方法。

這些建議是免費的:模塊可以幫助您將您的界面分組爲更多本地塊,而觀察者可以使後端細節更加獨立。從這裏開始,如果不知道你想要爆發什麼樣的東西,就很難更具體。

+0

你不能同時使用同一個名字定義模塊和類(你在這裏做的)。 –

+0

哪個模塊和類具有相同的名稱? – willglynn

+0

啊,我沒有意識到,我們可以使用完整路徑'Reservation :: Pipeline'而不是'class Reservation'來定義類中的模塊;模塊管道...'。不知道是否需要擔心該模塊是否定義爲類的一部分。 –