2013-06-08 5 views
0

Imaginez que vous ayez un contexte qui gère les transferts d'argent entre les comptes de l'utilisateur.Comment gérer les exceptions dans 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 

et les transferts d'argent sont déclenchées par une application web et le contrôleur de rails qui gèrent que les opérations fait quelque chose comme ça

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 

Donc ma question est, est-il OK pour un contexte de soulever des exceptions? Devrais-je attraper l'exception Role dans le contexte et déclencher une exception de contexte? (Les utilisateurs du contexte ne devraient pas savoir quels rôles sont utilisés), Y a-t-il une meilleure solution?

Merci

Répondre

0

Un contexte est un objet (oui, il y a des contraintes afin de ne pas tous les objets sont des contextes) et dans une opération d'un objet quelques exceptions sont dans l'ordre. Par exemple, un ArgumentNil pourrait être valide si ce qui aurait dû être un RolePlayer est nul à la place. Donc, pour répondre à votre question. Alors oui, un contexte peut lancer des exceptions s'il est lié aux opérations système encapsulées par le contexte.

Cela dit, je ne vois pas beaucoup de DCI dans votre exemple de code. Par exemple, il n'y a pas de méthodes de rôle dans le contexte et il semblerait que le comportement réel appartient à une classe et non à un rôle ou à un objet. Il y a un exemple de transfert d'argent sur fulloo.info ainsi que l'un des exemples de la gem maroon. Vous pouvez en savoir plus sur using maroon to do DCI in ruby (Bien que la syntaxe ait été simplifiée depuis l'écriture de cet article avec les exemples, cela devrait être un bon point de départ)

Questions connexes