2013-06-08 3 views
0

사용자 계정간에 송금을 처리하는 컨텍스트가 있다고 가정 해보십시오.DCI에서 예외를 처리하는 방법

class Account < ActiveRecord::Base 
    belongs_to :user 
end 

class MoneySender < SimpleDelegator 

    class NotEnoughBalanceError < StandardError ; ; end 

    def initialize(account) 
    super(account) 
    end 

    def send_money(destination_account, amount) 
    raise NotEnoughBalanceError unless can_send?(amount) 
    self.transaction do 
     self.balance -= amount 
     destination_account.balance += amount 
    end 
    self.balance 
    end 

    def can_send?(amount) 
    self.balance >= amount 
    end 

end 

class HandleMoneyTransferContext 

    def initialize(source, destination, amount) 
    @source = source 
    @destination = destination 
    @amount = amount 
    end 

    def transfer 
    sender = MoneySender.new(@source 
    sender.send_money(@destination, @amount) 
    end 

end 

그리고 송금이

class AccountsController < AplicationController 

    def transfer 
    source = Account.find(params[:id]) 
    destination = Account.find(params[:destination_account]) 
    HandleMoneyTransferContext.new(source, destination, params[:amount]).transfer 
    render 'success_page' 
    rescue MoneySender::NotEnoughBalanceError => e 
    flash[:error] = t(accounts.transfer.not_enough_money) 
    render 'error_page', status: 400 
    end 

end 

같은 것이 그래서 제 질문은, 그것은 OK 컨텍스트가 예외를 발생 할 수 있습니다 작업을한다는 것을 처리하는 웹 응용 프로그램과 레일 컨트롤러에 의해 트리거되는? 컨텍스트에서 역할 예외를 catch하고 컨텍스트 예외를 발생시켜야합니까? (컨텍스트 사용자는 어떤 역할이 사용되는지 알 필요가 없습니다), 더 좋은 해결책이 있습니까?

감사

답변

0

컨텍스트는 (예 제약 때문에 모든 객체가 컨텍스트 거기있다) 단지 객체이고 객체의 동작에서 약간의 예외는 순서에 있습니다. 예를 들어 ArgumentNil은 RolePlayer가 있어야했던 것이 nil 인 경우 유효 할 수 있습니다. 그래서 귀하의 질문에 대답하십시오. 그래서 예, 컨텍스트가 캡슐화하는 시스템 작업과 관련된 경우 컨텍스트는 예외를 throw 할 수 있습니다.

그건 내가 당신의 예제 코드에서 DCI를 많이 보지 않는다고 말했습니다. 예를 들어 컨텍스트에서 역할 메서드가 없으면 실제 동작이 클래스와 역할 또는 개체가 아닌 것 같습니다. fulloo.info에는 송금 예제가 있으며 밤색 보석 예제 중 하나가 있습니다. using maroon to do DCI in ruby에 대한 자세한 내용을 볼 수 있습니다 (예제와 함께이 기사를 작성한 이후로 구문이 단순화되었지만 여전히 좋은 시작점이어야 함).

관련 문제