gpt4 book ai didi

ruby - 替代 Ruby Case 语句

转载 作者:数据小太阳 更新时间:2023-10-29 07:44:55 24 4
gpt4 key购买 nike

我目前正在使用 Ruby 为银行管理系统编写程序。该系统的功能之一是它可以创建一个新帐户,帐户可以是六种类型之一。

我的 Controller 中有以下方法来满足此功能:

def create_account(type, holder)
case type
when :current then CurrentAccount.new(holder, @account_number)
when :savings then SavingsAccount.new(holder, @account_number)
when :business then BusinessAccount.new(holder, @account_number)
when :ir then IRAccount.new(holder, @account_number)
when :smb then SMBAccount.new(holder, @account_number)
when :student then StudentAccount.new(holder, @account_number)
end
end

这些账户中的每一个都继承自一个基础账户,最终将包含单独的属性,例如利率、 overdraw 等

虽然这是功能性的并且提供了所需的结果,但感觉有点冗长。但是我想不出任何明显的重构方法。

欢迎提出任何建议...

最佳答案

我假设在某些时候系统或最终用户正在有效地选择一种文本类型,您需要将其转换为一个类以供使用。否则,您可以编写简单地引用和实例化正确类的调用代码。

您可以通过定义符号 type 和类之间的映射来使您拥有的内容更清晰。因此,您可以在 create_account 的范围内执行此操作:

ACCOUNT_CLASS_FOR = Hash[
current: CurrentAccount,
savings: SavingsAccount,
business: BusinessAccount,
ir: IRAccount,
smb: SMBAccount,
student: StudentAccount
]

def create_account(type, holder)
if account_class = ACCOUNT_CLASS_FOR[ type ]
account_class.new( holder, @account_number )
else
raise "Bad account type #{type}"
end
end

这减少了重复代码,并使符号名称和匹配的 Ruby 类之间的映射更加明确。如果您需要在别处应用或测试转换,您可以使常量在不同的范围内可用,而无需重复自己。

您可以让每个类都知道自己的标签,例如

class CurrentAccount
def self.label
:current
end
end

然后你可以有这样的东西:

ALLOWED_ACCOUNT_CLASSES = [CurrentAccount,SavingsAccount,BusinessAccount, # etc.

ACCOUNT_CLASS_FOR = Hash[
ALLOWED_ACCOUNT_CLASSES.map { |klass| [klass.label, klass] }
]

请注意,在这里使用拼写错误的 klass 变量是很常见的做法,以避免与 Ruby 的 class 关键字发生冲突,但您也可以只使用 account_class

关于ruby - 替代 Ruby Case 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31034253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com