【问题标题】:How to get rid of similar argument in all functions如何摆脱所有函数中的类似参数
【发布时间】:2015-10-11 14:31:36
【问题描述】:

这是处理汇款的活动记录类。

class Wallet < ActiveRecord::Base
  belongs_to :user
  has_many :deposits, dependent: :destroy
  has_many :deposit_requests, dependent: :destroy
  has_many :withdrawals, dependent: :destroy
  has_many :withdrawal_requests, dependent: :destroy

  def deposit_with_tax_deduction! amount
    deposit! amount
    deduct_tax(amount)
  end

  def deposit! amount
    deposits.create! amount: amount - tax_for(amount)
  end

  def withdraw! amount
    if can_spend? amount
      withdrawals.create! amount: amount 
    else
      raise "Недостаточно средств"
    end
  end

  def total
    deposits.sum(:amount) - withdrawals.sum(:amount) + deposit_requests.success.sum(:amount) - withdrawal_requests.success.sum(:amount)
  end

  def can_spend? amount
    total - amount > 0
  end

  def tax_for(amount)
    amount.to_f * Option.current.tax / 100
  end

  private
  def deduct_tax(amount)
    AdminWallet.deposit! amount
  end
end

我几乎在课堂上的每个方法中都有相同的论点 (amount)。它是一种代码气味,多年后会导致不良后果吗?我应该遵循什么模式?

【问题讨论】:

    标签: ruby-on-rails ruby oop refactoring


    【解决方案1】:

    没关系。

    实例变量通常被认为是对象的状态。在您的情况下,“数量”变量将是状态的不必要突变,因为除了当前执行之外它没有任何重要性。

    但是,对我来说重要的是要提到这里没有严格的规则。这在很大程度上取决于您班级的性质。通常我们区分数据对象行为对象。前者通常更持久,而后者在使用上更具可配置性。因此,“状态”一词在每个词中都有不同的含义。

    目前,正如“钱包”类名称所暗示的,您有一个数据对象。稍后,您可能会重构您的代码并创建一个“事务”类。在这种类中,将数量设置为实例变量更有意义。您甚至可以轻松地使用命令模式来撤消您的操作。

    顺便说一句,传递大量参数是一种代码异味,这意味着您应该考虑将代码拆分为更多类。请记住:不要试图解决几年后可能遇到的问题。专注于你现在遇到的问题。

    【讨论】:

      【解决方案2】:

      您可以将金额定义为instance variable,因为您的方法也是instance methods

      所以

      class Wallet < ActiveRecord::Base
        ...
        attr_accessor :amount
      
        def tax_for
        end
        ...
      end
      

      你可以通过(ex)使用它

      wallet = Wallet.new
      wallet.amount = 100
      wallet.tax_for
      

      【讨论】:

        猜你喜欢
        • 2017-02-05
        • 2010-10-01
        • 2021-02-19
        • 2013-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多