2016-08-14 1 views
0

多くのエラーが発生する可能性のあるアプリケーションを開発しています。だから、私 - そしてこのアプリケーションを使う管理者 - はすべての関連情報を記録することに多くの関心を持っています。しかし、私はルビースタイルのガイドで苦労しています。 私はRubocopのデフォルトとノーマルコードの適合が大抵の場合大好きです。しかし、ロギングでは、通常のアプリケーションよりも多くのコード行が必要になります。Rubyスタイルのガイドとメッセージのロギング

例えば、これはトリックやスタイルガイドのログSICHエラーの一般的なパターンの方法を適合さがあり

def do_something 
    client.connect 
    rescue FirstErrorType => e 
    Logger.warn('Client') { "This is an error message for my Client: '#{e}'" } 
    sleep 10 
    retry 
    rescue SecondErrorType => e 
    Logger.warn('Client') {"This is an other error message for my Client: '#{e}'" } 
    sleep 5 
    retry 
    rescue ThirdErrorType => e 
    Logger.warn('Client') {"And even a third error message for my Client: '#{e}' "} 
    sleep 30 
    retry 
    end 
end 

構築参照してください?あるいは、この場合、スタイルガイドを無視しなければならないのですか?

+0

私があなたに求めるものは不明です。ロガースタイルのガイドに関連するロガーやエラーの表示方法を取得できません。 –

+0

上記の例では、 "Logger"を含む行が長すぎて、メソッド "do_something"に多くの行のコードが含まれているという警告が表示されます。 – PascalTurbo

+0

行が多すぎますか?だから、何本の線が正常ですか? [80 char](https://github.com/bbsosov/rubocop/blob/master/config/default.yml#L547)?なぜなのかご存知ですか?長い_行を2つの別々の行に分割してみませんか?ここで何が問題なの?私は決して 'rubocop'を使用しません、残念ですが、それは馬鹿です、私はシンボルと文字列のサイズについてではなく、コードとロジックについて考えることを好みます。 IMO –

答えて

0

ここには、おそらく問題の原因となる繰り返しがたくさんあります。

HANDLERS = { 
    FirstErrorType => { 
    level: :warn, 
    scope: 'Client', 
    message: "This is an error message for my Client", 
    delay: 10 
    }, 
    SecondErrorType => { 
    level: :warn, 
    scope: 'Client', 
    message: "This is an other error message for my Client", 
    delay: 5 
    }, 
    ThirdErrorType => { 
    level: :warn, 
    scope: 'Client', 
    message: "This is an other error message for my Client", 
    delay: 30 
    } 
} 

その後、あなたは一度だけ、一度、この背後にある実際の仕組みをコーディングし、任意のエラーから回復するために、このマッピングテーブルを使用することができます:あなたはおそらくやりたいことは、マッピングテーブルを定義している

def do_something 
    client.connect 

rescue => e 
    if (hander = HANDLERS[e.class]) 
    Logger.send(handler[:level], handler[:scope]) do 
     '%s: %s' % [ handler[:message], e.to_s ] 
    end 

    sleep(handler[:delay]) 

    retry 
    else 
    raise e 
    end 
end 

これより堅牢なバージョンでは、Rails rescue_from methodのスタイルでメタプログラミングを使用します。ここでは、この種の処理を行う小さなDSLがあります。

関連する問題