2015-02-10 57 views
2

我有困難重構這種情況下聲明:重構簡短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語句都是定義使用哪種「類型」的顏色。我想過定義一個類方法來設置投入的顏色,但看起來過於複雜。

+0

我相信你錯過了將* console_message *'method'放在*:log *和*:error *分支中? – 2015-02-10 02:32:38

+1

@JikkuJose這是故意的,它是一個變量:P – Net 2015-02-10 02:36:00

回答

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

這或多或少相同的代碼量,但沒有其重複性和意圖更加清晰,兩者都增加了可維護性。

+0

感謝您的回答,是否會更好地做 'color = case type ... end'? – Net 2015-02-10 02:55:23

+0

我寧願將該邏輯封裝到一個方法中,以便可以重用它,而另一種生成最終消息的方法讀取更容易,只做一件事(準備數據和構建消息)。 – dgilperez 2015-02-10 02:59:05

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 

注意

  • 刪除分支可以被認爲是一個更好的解決方案。