重构一个简短的案例陈述

时间:2015-02-10 02:15:10

标签: ruby refactoring

我很难重构这个案例陈述:

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语句都定义了使用哪种“类型”颜色。我想过定义一个类方法,它会在puts中设置颜色,但这看起来过于复杂。

2 个答案:

答案 0 :(得分:2)

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

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}"

它或多或少都是相同数量的代码,但没有重复,其意图更清晰,都可以提高可维护性。

答案 1 :(得分:2)

考虑一下:

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

注意

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