gpt4 book ai didi

ruby - 如何重构这个 6 行方法以使其更具可读性?

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

我正试图在这里清理这个非常丑陋的方法,它迫切需要重构,但我不确定哪种结构最能做到这一点(即 case 语句,或者只是一个精心格式化的 if then 语句)

乍一看,这似乎是一个理想的放置 case 语句的地方,带有一些放置得很好的 when,但我的理解是 case 语句只能用于单个变量,而不是两个变量,以及使用散列或数组尝试这些语句的 irb 的各种摆弄在这里也没有太多说明。

你会怎么做?在检查这样的多个 bool 值时,Ruby 中是否有任何常见的技巧来避免这样的代码?

  def has_just_one_kind_of_thing?(item, controller)
if (controller == 'foos' && item.widgets.blank?) || (controller == 'foos' && item.doohickeys.blank?) || (controller == 'bars' && item.widgets.blank?) || (controller == 'bars' && item.doohickeys.blank?) || (controller == 'bazes' && item.widgets.blank?) || (controller == 'bazes' && item.contraptions.blank?)
return true
else
return false
end
end

最佳答案

伙计们 - 似乎这里需要多态性,这不能通过在一种方法中摆弄流程控制来解决。

这是我从扩展版本开始的尝试:

def has_just_one_kind_of_thing?(item, controller)
(controller == 'foos' && item.widgets.blank?) ||
(controller == 'foos' && item.doohickeys.blank?) ||
(controller == 'bars' && item.widgets.blank?) ||
(controller == 'bars' && item.doohickeys.blank?) ||
(controller == 'bazes' && item.widgets.blank?) ||
(controller == 'bazes' && item.contraptions.blank?)
end

所以有三种不同的行为 - 每个 Controller 一个....如果每个 Controller 都足够聪明以包含特定于 Controller 的决策,并且您传入实际 Controller 而不仅仅是名称一个 Controller ,您将方法简化为:

def has_just_one_kind_of_thing?(item, controller)
controller.has_just_one_kind_of_thing?(item)
end

这需要每个 Controller 针对它是哪种 Controller 进行相关的项目处理。因此,让我们为每个 foos、bars 和 bazes 定义一个方法,称为 has_just_one_kind_of_thing?

foos 的例子:

def has_just_one_kind_of_thing?(item)
item.widgets.blank? || item.doohickeys.blank?
end

bazes 的例子:

def has_just_one_kind_of_thing?(item)
item.widgets.blank? || item.contraptions.blank?
end

在每个你想返回 false 的 Controller 上,只需应用“常量方法”模式:

def has_just_one_kind_of_thing?(item)
false
end

这段代码甚至会运行得更快,因为现在,我们不必像 Controller 类型那样进行尽可能多的检查——我们只需对 Controller 执行一种方法分派(dispatch)。

所以它在解释型 ruby​​ 中更快 - 它甚至可能在 jruby 中运行得更快或者其他可以大量优化方法调度的 ruby​​ 之一...

我们或许可以让它变得更聪明,但我需要知道这个方法在哪个类上,也许还有一些关于 item 的事情。

另一种重构方法是使 item 变得智能,并在每种类型的 item 上使用不同的方法。同样,我们需要了解更多关于对象模型的信息才能判断哪个是最好的...

这仍然是第一次剪辑。

关于ruby - 如何重构这个 6 行方法以使其更具可读性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1780672/

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