有可能简化这个方法吗?

llycmphe  于 2021-09-29  发布在  Java
关注(0)|答案(2)|浏览(445)

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

  1. LOGS = [{ "first_log" => ["first task"] }, { "second_log" => ["second task"] }, { "third_log" => ["third task", "additional task"] }]
  2. LOG_NAME = "second_log"
  3. def output
  4. LOGS.each { |log|
  5. if LOG_NAME
  6. puts "-#{log.keys.first.to_s}:", " Tasks: #{log.values.join(",")}" if log.key?(LOG_NAME)
  7. else
  8. puts "-#{log.keys.first.to_s}:", " Tasks: #{log.values.join(",")}"
  9. end
  10. }
  11. end

这里的目的是,当调用函数时,如果存在日志名,则只输出该日志(哈希对象)及其任务。如果不存在日志名称,它将输出日志数组中的所有日志(哈希对象)。
这很好,但我的问题是:有没有办法让这个方法更简单?我觉得我可以摆脱if/else逻辑,并进一步简化它,但我无法想象如何。我也尝试过使用rubocop,但它1)表示类似的if/else逻辑2)表示实际上没有输出任何内容的更正。
非常感谢您的任何想法,谢谢。

vs91vp4v

vs91vp4v1#

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

  1. LOGS = [{ "first_log" => ["first task"] }, { "second_log" => ["second task"] }, { "third_log" => ["third task", "additional task"] }]
  2. LOG_NAME = "second_log"
  3. def output
  4. LOGS.select { |log|
  5. LOG_NAME ? log.key?(LOG_NAME) : true
  6. }.each { |log| puts "-#{log.keys.first.to_s}:", " Tasks: #{log.values.join(",")}" }
  7. end
bxfogqkk

bxfogqkk2#

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

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

这样可以更容易地消化以下代码: LOG_NAME 日志的密钥已被删除 LOG_NAME 然后在其中跳过,否则继续执行。

相关问题