メソッドに機能を追加するメソッド

今日は.net用の自社ライブラリのお話。

メソッドのデリゲートにログ出力やリトライなどの機能を追加するメソッドを色々と作って使っていました。
以下は使用例。

//ログ出力を追加
Skin.Log(“test”, () => {
Hoge();
});

//リトライを追加
Skin.Retry(5, () => {
Hoge();
});

//メッセージBOX表示を追加
Skin.Msg(“msg”, () => {
Hoge();
});

上記のように1つだけ追加する場合は問題無いが、複数の追加を行う場合以下のようになり非常に分かりにくくなってしまいます。

//メッセージBOXを表示し、リトライを行い、ログ出力をしてから、Hoge()を実行
Skin.Msg(“msg”, () => Skin.Retry(5, () => Skin.Log(“test”, () => {
Hoge();
})));

汚い。特に最後の行の括弧が沢山並ぶのがきもい。
なんとか綺麗に書く方法がないか検討した結果、以下のようにメソッドチェインできるようにしてみました。

//メッセージBOXを表示し、リトライを行い、ログ出力をしてから、Hoge()を実行
new Action(() => {
Hoge();
}).Log(“test”).Retry(5).Msg(“msg”).Invoke();

すっきりしました。けど、追加する順番が逆になり、シーケンスがちょっと分かりにくい。
もう少し良い方法は無いか、今も考えています。

 

コメントを残す