##前提
イベントビューアに出力するログを管理したく、
メッセージ・ID・メッセージの種類(通知/エラー)をひとまとめにして合理的に管理したいです。
悩んでいたところ以下のようなコードを教えていただくことが出来ました。
C#
1public enum MessageLevel 2{ 3 Info, 4 Error 5} 6 7// メッセージ本体の抽象構造定義 8 9public abstract class Message 10{ 11 public abstract int Id { get; } 12 13 public abstract string Text { get; } 14 15 public abstract MessageLevel Level { get; } 16} 17 18public abstract class Info : Message 19{ 20 public override MessageLevel Level => MessageLevel.Info; 21} 22 23public abstract class Error : Message 24{ 25 public override MessageLevel Level => MessageLevel.Error; 26} 27 28 29// 共通メッセージ定義 30 31public class TaskDone : Info 32{ 33 public override int Id => 1; 34 35 public override string Text => "all tasks are done"; 36 37} 38 39public class CommandLineArgumentsError : Error 40{ 41 public override int Id => 2; 42 43 public override string Text => "need some command-line arguments"; 44} 45 46public class SpecialError : Error 47{ 48 public override int Id => 3; 49 50 public override string Text => "failed to backup log files"; 51} 52 53 54// ================================================================ 55// Project1 アセンブリ内 56 57// 追加メッセージ 58 59public class Project1HogeError : Error 60{ 61 public override int Id => 4; 62 63 public override string Text => "project1 local error"; 64} 65 66 67// ================================================================ 68// クライアントコード 69 70class Test 71{ 72 public void Main() 73 { 74 var message = new TaskDone(); 75 76 System.Console.WriteLine($"ID:{ message.Id }, Level:{ message.Level }, Content:{ message.Text }"); 77 } 78}
このコードは私が最初に書いたものより格段に分かりやすくなっているのですが、
個人的な都合により、いくつか課題があります。
##課題
1... IDをユニークにしやすいような仕組みがないこと
イベントログに出力するIDとメッセージは1対1にしたいため、
各クラスのIdプロパティにハードコーディングでIDを設定するよりは
簡単で安全な方法で各メッセージのIDを設定したいです。
2... IDを連番にしやすいような仕組みがないこと
1つ目の理由に近いのですが、IDは連番にしたいため
やはりIDはより簡単な方法で設定したいです。
私が最初に書いたコードは、
目も当てられないほど酷いコードだったのですが、
各メッセージを列挙体のメンバーと1対1で定義していたため、
IDをユニークにしたり連番にしたりすることは簡単でした。
列挙体なら各メンバーはデフォルトで一意かつ連番な整数値を持つからです。
##やりたいこと
前述のコードの良いところを利用しながら、IDの管理も合理的にできるようなコードを書きたいです。
アドバイスをよろしくお願いいたします。
##補足
この質問はひとつ前の質問の続きになっています。
見ても意味はないかもしれませんが、何か気になる点が御座いましたら御覧ください。
当該の質問につきましても、回答を受付中です。
→ ひとつ前の質問
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/06 12:08
2016/09/06 14:20