- ベストアンサー
アサーションでメソッドの引数をチェックする
お世話になります。 SJC-P取得のための勉強をしている中で、 次の疑問点があります。 ------------------------------------------ アサーションの使い方として、 (1)publicメソッドの引数をアサーションでチェックする--->ふさわしくない使い方 (2)privateメソッドの引数をアサーションでチェックする--->正しい使い方 ------------------------------------------ 以下のような解釈かと(無理やり)考えました。 privateメソッドは、自分自身しか使わない?ため、 引数に変な値を渡すことは無い。 publicメソッドは、他の人も使う可能性があり、 引数に変な値を渡すことが十分有りうる。 有り得る/有り得ないで、アサーションの 使う/使わないを決める??? しかしいまいちピンときません。 わかりやすく教えていただけませんでしょうか。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
個人的な意見ですが、 アサーションっていうのは、 いわば、プログラマがココでは、こうなっているハズという仮定を保証するものだと思います。 例えば a / b という処理をするときbが0なら0で割り算したという例外が起こるでしょう。 そういう例外は起こるべくして起こる例外ですので、こういう単なる例外に関して、 assert b!=0; とかしてアサーション例外を起こさせるのは変です。 bが0であるかどうかをチェックしたり、もし0ならそれを回避するような処理を書いていてその処理の後では、「bは0ではない」と仮定する ような場合には、アサートする意味がある(つまりこの部分で処理済みの処理にバグがあることを検出できる)と思います。 そういう意味では、単なるパラメータのチェックをpublicメソッドでやるなら例外を起こすべきだと思います。 privateメソッドの場合、クラスの実装をしている状態で、予期しないパラメータが渡されたということは、バグとしていいと思うので、そういうアサートはありだと思います。 基本的には、 ・この処理の前には、こうなっているハズだ ・この処理の後には、こうなっているハズだ ・この処理の前後で、かわっていないハズだ という仮定を保証するような場合に使うということでいいんじゃないでしょうか
その他の回答 (1)
- deadlock
- ベストアンサー率67% (59/87)
あとは、こんなトコです。 ・アサーションはオプションで無効にされることもある →publicメソッドの仕様(入力チェック)を満たさない可能性がある ・AssertionErrorが投げられるだけでは、使用側はなぜエラーなのか分からない →自分で適切な例外とメッセージを返すべき Sunのドキュメント(参考URL)には目を通しましたか?
お礼
deadlockさん、ありがとうございます。 >・アサーションはオプションで無効にされることもある >・AssertionErrorが投げられるだけでは、使用側はなぜエラーなのか分からない 確かにそうですね。その通りです。 >Sunのドキュメント(参考URL)には目を通しましたか? このようなページがあるんですね。見ておきます。 ありがとうございました。
お礼
BLUEPIXYさん、ありがとうございます。 教えていただいたこと、なかなか理解するのが難しかったのですが、最後の >基本的には、 >・この処理の前には、こうなっているハズだ >・この処理の後には、こうなっているハズだ >・この処理の前後で、かわっていないハズだ >という仮定を保証するような場合に使うということでいいんじゃないでしょうか というので、だいぶしっくり来るようになりました。