1

多くのサービス オブジェクトを持つアプリケーションに取り組んでいます。通常、これらのサービスの仕事は、1 つ以上の Active Record モデルを構築することです。サービスがアプリケーションに結び付けられるのを避けるために、ユーザーがモデルの名前を変更できるようにしています。次に例を示します。

class MyServiceObject
  attr_reader :options

  def initialize(options = {})
    @options = options
    @options[:foo_klass] ||= Foo
  end

  def do_something
    options[:foo_klass].new
  end
end

かなりうまく機能すると思いましたが、このソリューションには柔軟性が欠けている場合があることがわかりました。たとえば、属性の 1 つを使用してモデルを検索する必要があるサービスがあります。それが私がそれを実装したかった方法です:

class MyServiceObject
  attr_reader :options

  def initialize(options = {})
    @options = options

    @options[:lookup_proc] ||= Proc.new do |attribtue|
      DefaultModel.find_by_attribute(attribtue)
    end
  end

  def do_something(attribtue)
    options[:lookup_proc].call(attribtue)
  end
end

それが最も適切な解決策であるかどうかはわかりません。一部の記事では、一種の「アダプター」である別のサービス オブジェクトを使用していますが、このような単純なユース ケースではやり過ぎのようです。

何か提案はありますか?現在のアプローチを続けますか?

4

0 に答える 0