2014-10-10 69 views
1

我正在使用Rails和Resque,但這更多的是關於實際的邏輯應該與後臺作業去哪裏的設計問題。在哪裏應該後臺作業邏輯去

我有這樣一個類:

class Ticket 
    # 1) should method go here? 
end 

和BG的工作是這樣的:

module Jobs 
    class PayTicket 
    # 2) or should the method go here? 
    end 
end 

然後有一個處理票務計費的方法。它使兩個網絡電話(其中之一將是緩慢的),所以很明顯,我們需要一個後臺作業

def pay_ticket 
    # calls out to stripe and another network call 
    end 

1)如果我把邏輯#1以上,似乎是有意義的房子邏輯支付Ticket課程的門票。然後,我將實例化BG作業中的Ticket對象。這樣做的缺點是我不希望人們在背景作業之外調用pay_ticket方法,所以我需要添加一個說「只能用BG作業調用」的評論......這看起來很糟糕。

2)如果我把pay_ticket邏輯放在BG作業中,那麼我知道它只會在那裏被調用,但是它離開了那個感覺像應該去的類。

就像一些關於人們是否有胖背景工作或者邏輯通常停留在模型中的一般想法。或者,如果這取決於每種情況。謝謝!

+0

我知道(或者我想我知道)什麼是「Ticket」,但「PayTicket」聽起來不像一個對象。也許你的問題從那裏開始。 – alexis 2014-10-10 18:52:01

+0

@alexis它可能是一個TicketPaymentService。這聽起來像是一個對象嗎? – 2014-10-10 20:53:08

+0

更好。那麼服務可以做些什麼?它可以支付票嗎?那麼支付方法就屬於這種情況,特別是如果你能想象它被廣義化了,並且它只依賴於Ticket的接口來獲得必要的信息。 – alexis 2014-10-10 23:35:54

回答

1

這實際上取決於你想如何構建你的代碼。我堅信模型設計模式,但它確實取決於每個開發人員。無論哪種方式聽起來好像考慮到情況會好,所以我想我的第一個問題是,你在共享項目中開發(即其他人將在這個代碼上工作嗎?)

如果沒有,我會說通過它在模型中保持與模型相關的邏輯儘可能接近源。

如果你是這樣,揭露邏輯可能有點危險,但評論真的不是什麼大問題。

如果你真的不想讓任何人調用該方法,但想要讓你擁有所有的功能,但不暴露pay方法遵循OOP /封裝的方法,你總是可以繼承的票務模式。例如:

# models/ticket.rb 
class Ticket 
    ... 
end 

# lib/payable_ticket.rb 
class PayableTicket < Ticket 
    def pay 
     .... 
    end 
end 

只是我的兩分錢,但我希望有所幫助。

+0

還有其他方法可以對此進行建模。例如一個只知道如何支付門票的新對象。 'TicketPayment.new(票).pay!'它不需要是一張票,它必須是一名工人。 – 2014-10-10 20:57:32

相關問題