1

저는 레일즈와 리스터를 사용하고 있습니다. 그러나 이것은 실제 로직이 백그라운드 작업과 함께 있어야하는 위치에 대한 디자인 질문에 가깝습니다.백그라운드 작업 로직은 어디로 가야합니까?

class Ticket 
    # 1) should method go here? 
end 

이 같은 BG 작업 :

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

그런 다음 티켓에 대한 청구를 처리하는 방법이 있어요

는이 같은 클래스를 가지고있다. 그것은 두 개의 네트워크 호출을 (그 중 하나가 느려질 수)하게, 그래서 # 1의 논리를 넣을 경우이 논리 것을 집에 이해하는 것 이상은) 우리가 백그라운드 작업

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

1을 필요로 분명 Ticket 클래스로 티켓을 지불하십시오. 그런 다음 BG 작업에서 Ticket 객체를 인스턴스화합니다. 이것의 단점은 사람들이 백그라운드 작업 이외의 방법으로 pay_ticket 메서드를 호출하는 것을 원하지 않는다는 것입니다. 따라서 "BG 작업만으로 호출"등의 주석을 추가해야합니다. 이것은 나쁜 형식처럼 보입니다.

2) 내가 BG 작업에 pay_ticket 논리를 넣으면 그곳에서만 호출된다는 것을 알지만, 그렇다면 느낀 곳에서 이되어야합니다.이되어야합니다.

사람들이 뚱뚱한 배경 작업을 갖고 있거나 로직이 일반적으로 모델에 남아있는 경우에 대한 일반적인 생각이 맘에 드는 것일까 요? 또는 각 상황에 따라 달라지는 경우. 감사!

+0

나는 '티켓'이 무엇인지 알고 있지만, 'PayTicket'은 객체처럼 들리지 않습니다. 어쩌면 당신의 문제가 시작될 수도 있습니다. – alexis

+0

@alexis TicketPaymentService가 될 수 있습니다. 그게 지금 사물처럼 들리는가? –

+0

그렇다면 서비스는 어떤 일을 할 수 있습니까? 티켓을 낼 수 있습니까? 그런 다음 지불 방법이 거기에 속합니다. 특히 그것이 일반화되었다고 상상할 수 있다면, 필요한 정보를 얻기 위해'티켓 '인터페이스에만 의존합니다. – alexis

답변

1

정말 코드 구조화 방법에 달려 있습니다. 나는 확고한 신자인데 지방의 모델 디자인 패턴이지만 실제로는 각 개발자에게 달려있다. 어느 쪽이든 상황이 좋을 때처럼 상황이 좋을 것 같아서 첫 번째 질문은 공유 프로젝트에서 개발하고 있습니까? (예 : 다른 사람들이이 코드를 사용하고 있습니까?)

그렇지 않다면 이를 모델에서 처리하고 모델과 관련된 로직을 가능한 소스에 가깝게 유지합니다.

당신이 있다면, 그 논리를 드러내 기가 약간 위험 할 수 있지만 댓글은 실제로 그다지 큰 거래가 아닙니다.

당신이 정말 그 메소드를 호출하는 사람을 원하지만 당신은 모든 기능을 가지고 있지만, pay 방법을 노출시키지 않도록 항상 티켓 모델을 서브 클래스 수있는 OOP/캡슐화 된 접근 방식을 따라하고 싶지 않은 경우. 예 :

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

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

내 두 센트이지만 도움이 되길 바랍니다.

+0

다른 방법으로이를 모델링 할 수 있습니다. 예를 들어, 티켓을 지불하는 방법 만 알고있는 새로운 객체. 'TicketPayment.new (ticket) .pay!'그것은 티켓이 될 필요가 없으며 그것은 노동자가 될 필요가있다. –

관련 문제