0

私は ActiveRecord モデルを持っていReservationます。
クラスが大きすぎて、やりすぎるというところまで来ました。それをいくつかの異なるものに分割し、それらをモジュール
の下に配置したいと思います。Reservation

残念ながら、これはアプリを壊します。

現時点では、次のオプションが表示されます。

  • 名前空間をReservationConcerns似たようなものに
  • 機能をクラス自体に追加しますReservationが、物理的にサブディレクトリに移動します(Reservationにあるapp/models/reservation.rbReservation::Pipelineにあるapp/models/reservation/pipeline.rbなど)。

したがって、問題は、アプリを壊すことなく、1 つのかさばるクラスとして既にそれを持っている機能のさまざまな懸念をどのように構造化するかです。

4

1 に答える 1

0

パブリックインターフェイスを変更せずにRubyクラスをさまざまなコンポーネントに分割する場合、1つの解決策はモジュールを使用することです。

# 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はオブザーバーも提供します。これは、「モデルクラスがクラスのコア責任に関係しない機能で負担をかけられているときに通常発生する混乱を減らすための優れた方法です」。オブザーバーは、 ActiveModel::Dirtyメソッドを多用することがよくあります。

これらの提案は補完的です。モジュールはインターフェースをよりローカルなチャンクにグループ化するのに役立ち、オブザーバーはバックエンドの詳細をより自己完結型にすることができます。ここから、あなたがどの部分を破ろうとしているのかを正確に知らずに、より具体的にすることは困難です。

于 2012-10-17T03:02:10.997 に答える