【问题标题】:Is it possible to simplify this method?是否可以简化此方法?
【发布时间】:2023-03-08 09:45:01
【问题描述】:

我正在使用测试方法在我正在制作的 cli 工具中对方法进行建模,以便单独处理该方法。这是一个非常简单的方法,我试图让它尽可能简单。我设法将方法简化为:

LOGS = [{ "first_log" => ["first task"] }, { "second_log" => ["second task"] }, { "third_log" => ["third task", "additional task"] }]

LOG_NAME = "second_log" 

def output
  LOGS.each { |log| 
    if LOG_NAME
      puts "-#{log.keys.first.to_s}:", " Tasks: #{log.values.join(",")}" if log.key?(LOG_NAME)
    else
      puts "-#{log.keys.first.to_s}:", " Tasks: #{log.values.join(",")}" 
    end
    }
end

这里的目的是,当调用函数时,如果存在 LOG_NAME,它只会输出该日志(哈希对象)及其任务。如果不存在 LOG_NAME,它将输出 LOGS 数组中的所有日志(哈希对象)。

这很好用,但我的问题是:有没有办法让这个方法更简单?我觉得我可以摆脱 if/else 逻辑并更加简化它,但我无法想象如何。我也尝试过使用 rubocop,但它 1) 建议类似的 if/else 逻辑 2) 建议实际上不输出任何内容的更正。

任何想法都非常感谢,谢谢。

【问题讨论】:

  • 你的LOGS 常量对我来说似乎很奇怪。将其定义为Hash,而不是Array 是否更有意义,例如:LOGS = {"first_log" => ["first task"], "second_log" => ["second task"], ... }
  • 我也对LOG_NAME constant 感到有些困惑。为什么它是一个常量
  • 这些都只是我在实际 cli 工具中使用的对象建模的一种方式。

标签: ruby oop methods simplify


【解决方案1】:

我认为您可以通过将日志过滤与日志打印分开来改进此代码。这种方法减少了重复,我认为更好地描述了这个问题。

LOGS = [{ "first_log" => ["first task"] }, { "second_log" => ["second task"] }, { "third_log" => ["third task", "additional task"] }]

LOG_NAME = "second_log" 

def output
  LOGS.select { |log|
    LOG_NAME ? log.key?(LOG_NAME) : true
  }.each { |log| puts "-#{log.keys.first.to_s}:", " Tasks: #{log.values.join(",")}"  }
end

【讨论】:

  • 这是个好主意,我喜欢选择要打印的日志和实际打印的分离。我的一个挂断(可能是不合理的)是这是否一定“更简单”。我主要担心如果我将这段代码展示给其他人,可能不会立即清楚我要做什么,尽管这可能与我自己阅读代码的能力有关。
【解决方案2】:

为什么不直接跳过匹配条件的迭代?

def output
  LOGS.each do |log|
    next if LOG_NAME && log.key?(LOG_NAME)
    puts "-#{log.keys.first.to_s}:", " Tasks: #{log.values.join(",")}" 
  end
end

这样更容易消化代码,如果LOG_NAME 和日志的键中有LOG_NAME 则跳过,否则继续执行。

【讨论】:

  • 感谢您的想法。我认为这或多或少地实现了我的目标,但是我不得不说我更喜欢以前的(现在选择作为接受的答案)答案,只是出于个人喜好(我喜欢每个步骤的分段,即选择 then返回数组中每个元素的打印)。
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多