###最初に
いつもお世話になります。
C#での実装について悶々とする点があったため、力をお借りしたいです。
dynamicとキャスト、どちらで実装するべきか
特定の例外クラスに定義されているErrorCodeプロパティを取得するメソッドがあると仮定します。
メソッド内に登場するApiExceptionとHttpExceptionはどちらもErrorCodeというプロパティが定義されています。ApiExceptionとHttpExceptionは継承関係にありません。
引数にはExceptionのインスタンスを渡し、両者の型以外の場合はnullを返します。
C#
1 private static HttpStatusCode? TryGetErrorCode(Exception ex) 2 { 3 HttpStatusCode? httpStatusCode = null; 4 5 //実装1 6 switch (ex) 7 { 8 case ApiException apiEx: httpStatusCode = (HttpStatusCode)apiEx.ErrorCode; break; 9 case HttpException httpEx: httpStatusCode = (HttpStatusCode)httpEx.ErrorCode; break; 10 } 11 12 //実装2 13 dynamic dynamicEx = ex; 14 httpStatusCode = dynamicEx?.ErrorCode; 15 16 return httpStatusCode; 17 }
上記のような機能の実装に関して、私は2つの方法を考えました。
前者は型のキャストをする方法で、後者は動的な型に変換する方法です。
両者の手法は、どちらも一長一短あると考えています。
方法 | メリット | デメリット |
---|---|---|
キャストをする方法 | 型安全 | ErrorCodeを持つExceptionクラスが増えるたびにcaseを増やさなければならない。(継承関係にある場合は別) |
動的な型に変換する方法 | コードが短い | HttpStatusCode型に変換できる型(すなわちint)ではない型が来た場合に、実行時例外が発生する |
※この時点で私の認識に間違いがあればご指摘をお願いします。
###質問
可読性や保守性などの考慮を含めて、本来はどちらの手法で実装するべきでしょうか。
また、別案がございましたら是非ご教授をお願いします。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/28 10:31