我很难重构这个案例陈述:
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中设置颜色,但这看起来过于复杂。
答案 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
注意: