コントローラーをサービス オブジェクトに渡すのが好きな同僚がいます。たとえば、コントローラ メソッドは次のようになります。
class FooController < ApplicationController
...
def show
Foo.new(self).call
end
...
end
サービス オブジェクトは次のようになります。
class Foo
attr_reader :controller, :resource_id
delegate :render, :params, :head, to: :controller
def initialize(controller, resource_id)
@controller = controller
@resource_id = resource_id
end
def call
resource = SomeActiveRecordModel.find(resource_id)
if resource
render json: resource.to_json
else
head :not_found
end
end
end
どういうわけか、これは逆効果であり、カーゴカルトのソフトウェア エンジニアリングの例であると感じています。
サービスオブジェクトをコントローラーから完全に分離したいです。依存関係はサービス オブジェクトのコンストラクターに渡され、パラメーターはメソッドの引数としてサービス オブジェクトに渡されます。結果はメソッドから単純に返されます。
悲しいことに、私がコード レビューでこの問題を持ち出すたびに、私の同僚はこれにまったく興奮していません。
それぞれのアプローチの長所と短所は何ですか? どうすれば自分の主張をうまく主張できますか? ここで何か不足していますか?