Ognacの雑感

木漏れ日々

目次

Blog 利用状況

書庫

ギャラリ

エラー対応処理とメソッドの完成度

▼例1▼
    Public Function 割算(ByVal x As Integer, ByVal y As Integer) As Integer
        Return CInt(x / y)
    End Function
▲例1▲
これだけだと, y=0の時,死ぬので,失格です。
▼例2▼
    Public Function 割算(ByVal x As Integer, ByVal y As Integer) As Integer
        if y=0 then
            Throw New ApplicationException("除数が0です")
        end if
        Return CInt(x / y)
    End Function
▲例2▲
これでOKでしょ. (除数0以外の例外はややこしくなるのでスルー)   
呼ぶ側が
       dim a as Integer =45
       dim b as Integer =0
     dim ans as integer = 割算(a,b) 
でなく
       dim a as Integer =45
       dim b as Integer =0
       if  割算妥当性check(a,b) then
         dim ans as integer  = 割算(a,b) 
           ' ansを使った処理…
       end if
としてあり,割算妥当性checkが
▼例3▼
    Public Function 割算妥当性check(ByVal x As Integer, ByVal y As Integer) As boolean
        if y=0 then
            return false
        end if
        Return true
    End Function
▲例3▲
としてある場合の 割算はどう記述すべきか
▼例4▼
    Public Function 割算(ByVal x As Integer, ByVal y As Integer) As Integer
        Return CInt(x / y)
    End Function
▲例4▲
これで良いと思いますが、単体でみると潜在バグを孕んでいるコードに見えてしまいます。
同一ソース上で割算妥当性check()が見えるので, 理解を得られますが, コードが見えない場合、不安になりすま。
このように,事前にエラー要因が弾かれてる場足, メインメソッド(割算()) での y=0の対処は不要ですよね(?)
しかし、コピペで割算() の部分だけ他に流用されて潜在バグだと騒がれて嫌な目をしたくないので,冗長だがエラーチェックをつけたりすることもあります。
結局ケースバイケースでしょうが。どうされています?

投稿日時 : 2006年11月13日 11:18

Feedback

# re: エラー対応処理とメソッドの完成度 2006/11/13 15:12 まどか

うーん、例が(^^;

「割り算」という言葉だけで見ると親がチェックすべき処理かなとも思います。

が、一般的な話なので、「割り算」が仕様を持っているべきで、親はそれに従うだけでよいのではないでしょうか。
#Parse,TryParse
親に独自の分岐処理があるか、また「割り算」がそれを吸収した仕様になっているかによると思うので
私の場合もケースバイケースですね。

あ、Publicがゆえにチェックは必要かも。

# re: エラー対応処理とメソッドの完成度 2006/11/13 19:42 ognac

まどかさん、ありがとうございます。
>うーん、例が(^^;
うん。例が不味いですハイ。

> 「割り算」が仕様を持っているべき

>Publicがゆえにチェック

というキーワードから, privateで自分内でCloseしている分には, メソッドは不完全でもOK
Publicで公開する以上は, 冗長であってもチェックすべき
と言う感じですね。
protectで継承を許しているときも準拠ですね。

# re: エラー対応処理とメソッドの完成度 2006/11/13 23:01 Jitta

 チェッカーだけ。ApplicationException だと、「計算できない」という情報が落ちてしまいます。これなら投げない方がいい。Integer だと無いですが、Inf のある型であれば、こいつを戻すとか。

# re: エラー対応処理とメソッドの完成度 2006/11/13 23:36 THREE-ONE

投げるならば ArithmeticException だと思います。
これなら Jitta さんの指摘は多少は防げるでしょうか?

そもそも 0 除算は例外とするべき場合と、無限大を返すべき場合があると思うので例としては不適切ではないかと。

# re: エラー対応処理とメソッドの完成度 2006/11/14 0:15 中博俊

0で割ればおちるんだからそのままでいいんじゃない?

# re: エラー対応処理とメソッドの完成度 2006/11/14 0:43 ognac

Jittaさん、THREE-ONEさん、中博俊さん、ありがとうございます。
 悪い例でした。ごめんなさい。
>チェッカーだけ。ApplicationException だと、「計算できない」という情報が落ちてしまいます。
>投げるならば ArithmeticException だと思います。
Throw New ArithmeticException ですね.
と.何も施さなくても例外がでるから,なにもしないのと同じになる......!!!
例が悪かった....よく考えたら, CLIが起こす例外をCatchする方がスマートな場合もありました。
うーん、奥が深い。

# re: エラー対応処理とメソッドの完成度 2006/11/14 10:53 ognac

中さんって, 漢字とローマ字使い分けてらっしゃいます?
境界線が判りませんです。

# re: エラー対応処理とメソッドの完成度 2006/11/14 11:52 中博俊

使い分けてるわけじゃなくって、マシンが違うだけ

タイトル
名前
Url
コメント