重构一个简短的案例陈述
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
注意:
- 删除分支可能被认为是更好的解决方案。
我在重构这个 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
注意:
- 删除分支可能被认为是更好的解决方案。