重组庞大的课程

时间:2012-10-17 02:08:25

标签: ruby-on-rails ruby activerecord refactoring

我有一个ActiveRecord模型Reservation 它达到了这样一个程度,即班级规模大而且做得太多 我想将它分成几个不同的,并将它们放在Reservation模块下。

不幸的是,这会破坏应用程序。

此时我看到以下选项:

  • 将其命名为ReservationConcerns或类似的
  • 将功能添加到Reservation类本身,但实际将其移动到子目录(Reservation将位于app/models/reservation.rbReservation::Pipeline将位于app/models/reservation/pipeline.rb等等)。

所以问题是如何构建已经将其作为一个单一,庞大的类而不破坏应用程序的功能的不同问题

1 个答案:

答案 0 :(得分: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方法。

这些建议是免费的:模块可以帮助您将界面分组到更多本地块,而观察者可以使后端细节更加独立。从这里开始,如果不确切地知道你想要突破的部分,就很难具体化。