首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理DCI中的异常

如何处理DCI中的异常
EN

Stack Overflow用户
提问于 2013-06-09 05:01:13
回答 1查看 133关注 0票数 0

假设您有一个上下文来处理用户帐户之间的转账。

代码语言:javascript
复制
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

资金转账是由web应用程序触发的,处理这些操作的rails控制器如下所示

代码语言:javascript
复制
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

所以我的问题是,上下文是否可以引发异常?我是否应该捕获上下文中的角色异常并引发上下文异常?(上下文用户不应该知道正在使用哪些角色),有没有更好的解决方案?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2013-06-09 21:22:17

上下文只是一个对象(是的,有约束,所以不是所有的对象都是上下文),并且在对象的操作中,一些异常是正常的。例如,如果本应为RolePlayer的内容为空,则ArgumentNil可能是有效的。所以来回答你的问题。所以,是的,如果一个上下文与它封装的系统操作相关,那么它就会抛出异常。

也就是说,我在您的示例代码中没有看到太多的DCI。例如,上下文中没有角色方法,看起来实际的行为属于一个类,而不是角色或对象。在fulloo.info上有一个转账的例子,还有一个栗色宝石的例子。您可以阅读有关using maroon to do DCI in ruby的更多内容(尽管在撰写该文章和示例之后,语法已经简化,但这仍然是一个很好的起点)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17003808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档