0

我有一個喜歡將控制器傳遞給服務對象的同事。例如,一個控制器方法可能如下方式:Rails服務對象和控制器

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 

不知怎的,我覺得這是適得其反,貨物邪教軟件工程的一個實例。

我寧願保持服務對象與控制器完全分離。依賴關係將被傳遞到服務對象的構造函數中,參數將作爲方法參數傳遞給服務對象。任何結果都只是從方法返回。

不幸的是,只要我在代碼審查中提出這個問題,我的同事們就不會感到非常激動,而我反過來覺得這個代碼審查比較沮喪。

各種方法的優缺點有哪些?我怎樣才能更好地辯論我的案子?我在這裏錯過了什麼嗎?

回答

1

我懷疑答案是「這取決於」。

在你給出的確切例子中,我沒有看到特別的優勢,它創造了一定程度的混淆。另外,一般來說,我同意將服務對象與控制器分開。

但是,有時候我發現自己將控制器傳遞給服務對象。例如,當我在動態構建視圖時需要做很多複雜的工作。