如何摆脱所有函数中的相似参数
How to get rid of similar argument in all functions
这是处理汇款的活动记录class。
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
我几乎在 class 中的每个方法中都有相同的论点 (amount
)。它是一种代码味道,多年后会导致不良后果吗?我应该遵循什么模式?
您可以将金额定义为 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
没问题。
实例变量通常被认为是一个对象的状态。在您的情况下,"amount" 变量将是状态的不必要突变,因为它除了当前执行之外没有任何重要性。
不过,重要的是我要提一下这里没有严格的规定。这在很大程度上取决于您 class 的性质。通常我们区分数据对象和行为对象。前者通常更持久,而后者在其使用方面更具可配置性。因此 "state" 这个词在每个词中都有不同的含义。
目前,正如 "Wallet" class 名称所示,您有一个数据对象。稍后,您可能会重构代码并创建 "Transaction" class。在这种 class 中,将 amount 设置为实例变量更有意义。您甚至可以轻松地使用命令模式来撤消您的操作。
顺便说一句,传递过多的参数是一种代码味道,这意味着您应该考虑将代码拆分为更多 classes。请记住:不要试图解决几年后可能遇到的问题。专注于您现在遇到的问题。
这是处理汇款的活动记录class。
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
我几乎在 class 中的每个方法中都有相同的论点 (amount
)。它是一种代码味道,多年后会导致不良后果吗?我应该遵循什么模式?
您可以将金额定义为 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
没问题。
实例变量通常被认为是一个对象的状态。在您的情况下,"amount" 变量将是状态的不必要突变,因为它除了当前执行之外没有任何重要性。
不过,重要的是我要提一下这里没有严格的规定。这在很大程度上取决于您 class 的性质。通常我们区分数据对象和行为对象。前者通常更持久,而后者在其使用方面更具可配置性。因此 "state" 这个词在每个词中都有不同的含义。
目前,正如 "Wallet" class 名称所示,您有一个数据对象。稍后,您可能会重构代码并创建 "Transaction" class。在这种 class 中,将 amount 设置为实例变量更有意义。您甚至可以轻松地使用命令模式来撤消您的操作。
顺便说一句,传递过多的参数是一种代码味道,这意味着您应该考虑将代码拆分为更多 classes。请记住:不要试图解决几年后可能遇到的问题。专注于您现在遇到的问题。