重构一个简短的案例陈述

Refactoring a short case statement

我在重构这个 case 语句时遇到困难:

case type
when :log
  console = 'LOG'.on_blue.bold

  console_prefix = "#{prefix}:".blue.bold if prefix
when :error
  console = 'ERROR'.on_red.bold

  console_prefix = "#{prefix}:".red.bold if prefix
  console_message = message.red
when :ok
  console = 'OK'.on_green.bold

  console_prefix = "#{prefix}:".green.bold if prefix
end

puts "#{console} #{console_prefix} #{console_message}"

有一个变量 type 等于 :log:error:ok。我正在使用 colorize gem 为我的控制台输出着色。所有 case 语句所做的就是定义与 "type" 一起使用的颜色。我考虑过定义一个 class 方法来设置 puts 的颜色,但这似乎过于复杂。

您可以像这样减少代码中的重复:

def color_for_type(type)
  case type
  when :log
    :blue
  when :error
    :red
  when :ok
    :green
  else
    :black 
  end
end

然后像这样打印消息:

color           = color_for_type(type)
console         = type.to_s.upcase.send("on_#{color}").bold
console_prefix  = "#{prefix}:".send(color).bold if prefix
console_message = console_message.red if type == :error

puts "#{console} #{console_prefix} #{console_message}"

它的代码量大致相同,但没有重复,其意图更加明确,从而提高了可维护性。

考虑一下:

require 'colorize'

class CLI
  COLORS = { log: :blue, error: :red, ok: :green }

  def output
    prefix = "PREFIX"
    message = "Hello World"
    type = :error

    [
      console(type),
      console_prefix(prefix: prefix, type: type),
      console_message(message: message, type: type),
    ].compact.join(" ")
  end

  def console(type)
    type.to_s.upcase.send("on_#{COLORS[type]}").bold
  end

  def console_prefix(prefix: nil, type: :log)
    "#{prefix}:".send(COLORS[type]).bold
  end

  def console_message(message: nil, type: :error)
    message.to_s.red if type == :error
  end

  def print
    puts output
  end
end

CLI.new.print

注意

  • 删除分支可能被认为是更好的解决方案。