• ベストアンサー

アサーションでメソッドの引数をチェックする

お世話になります。 SJC-P取得のための勉強をしている中で、 次の疑問点があります。 ------------------------------------------ アサーションの使い方として、 (1)publicメソッドの引数をアサーションでチェックする--->ふさわしくない使い方 (2)privateメソッドの引数をアサーションでチェックする--->正しい使い方 ------------------------------------------ 以下のような解釈かと(無理やり)考えました。 privateメソッドは、自分自身しか使わない?ため、 引数に変な値を渡すことは無い。 publicメソッドは、他の人も使う可能性があり、 引数に変な値を渡すことが十分有りうる。 有り得る/有り得ないで、アサーションの 使う/使わないを決める??? しかしいまいちピンときません。 わかりやすく教えていただけませんでしょうか。 よろしくお願いします。

  • kutu
  • お礼率54% (152/279)
  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

個人的な意見ですが、 アサーションっていうのは、 いわば、プログラマがココでは、こうなっているハズという仮定を保証するものだと思います。 例えば a / b という処理をするときbが0なら0で割り算したという例外が起こるでしょう。 そういう例外は起こるべくして起こる例外ですので、こういう単なる例外に関して、 assert b!=0; とかしてアサーション例外を起こさせるのは変です。 bが0であるかどうかをチェックしたり、もし0ならそれを回避するような処理を書いていてその処理の後では、「bは0ではない」と仮定する ような場合には、アサートする意味がある(つまりこの部分で処理済みの処理にバグがあることを検出できる)と思います。 そういう意味では、単なるパラメータのチェックをpublicメソッドでやるなら例外を起こすべきだと思います。 privateメソッドの場合、クラスの実装をしている状態で、予期しないパラメータが渡されたということは、バグとしていいと思うので、そういうアサートはありだと思います。 基本的には、 ・この処理の前には、こうなっているハズだ ・この処理の後には、こうなっているハズだ ・この処理の前後で、かわっていないハズだ という仮定を保証するような場合に使うということでいいんじゃないでしょうか

kutu
質問者

お礼

BLUEPIXYさん、ありがとうございます。 教えていただいたこと、なかなか理解するのが難しかったのですが、最後の >基本的には、 >・この処理の前には、こうなっているハズだ >・この処理の後には、こうなっているハズだ >・この処理の前後で、かわっていないハズだ >という仮定を保証するような場合に使うということでいいんじゃないでしょうか というので、だいぶしっくり来るようになりました。

その他の回答 (1)

  • deadlock
  • ベストアンサー率67% (59/87)
回答No.2

あとは、こんなトコです。 ・アサーションはオプションで無効にされることもある   →publicメソッドの仕様(入力チェック)を満たさない可能性がある ・AssertionErrorが投げられるだけでは、使用側はなぜエラーなのか分からない   →自分で適切な例外とメッセージを返すべき Sunのドキュメント(参考URL)には目を通しましたか?

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/lang/assert.html
kutu
質問者

お礼

deadlockさん、ありがとうございます。 >・アサーションはオプションで無効にされることもある >・AssertionErrorが投げられるだけでは、使用側はなぜエラーなのか分からない 確かにそうですね。その通りです。 >Sunのドキュメント(参考URL)には目を通しましたか? このようなページがあるんですね。見ておきます。 ありがとうございました。

関連するQ&A

  • 仮引数を用いた「メソッドの定義」について質問

    仮引数を用いての「メソッドの定義」について、疑問点があります 以下のHPに以下のソースコードがありました。 http://sjc-p.obx21.com/word/jk/formalparameter1.html class Dentaku{ public int plus( int i, int j ){ return i + j; } } 質問:これは、定義という観点から考えると、「pulusメソッドはi+jという加法の計算をする機能を持ったメソッドであることを定義している。」といえますか? 質問2:returnについて調べたのですか、抽象的すぎてようわかりませんでした。。どういう意味ですか? 質問3:iとjは仮引数で、int型ならどんな値でも代入できますよね?

    • ベストアンサー
    • Java
  • なぜmainメソッドにだけ固定の引数があるのか?

    Javaの初心者です。 勉強していてふと思ったのですが、なぜmainメソッドだけに main(String[] X) のようにのストリング型の配列を引数に必ず設定しないといけないのでしょうか? 他のメソッドであれば、引数の有る無しをプログラマが決めることができますよね? そのため疑問に思ったのですが、どなたか教えていただけないでしょうか?

  • 自作したメソッド・・・引数はなるべく省略すべき?(VB2005)

    自作したメソッドに関して、引数はなるべく設定するべきでしょうか?それとも、引数は省略できるなら省略したほうがよいでしょうか? 下記(a)、(b)は例です。 a)引数はなるべく省略   ---------------------------------   Private Sub hoge()     Call foo()   End Sub   Private Sub foo()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     '処理   End Sub   --------------------------------- b)あえて引数を設定   ---------------------------------   Private Sub hoge()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     Call foo(hoga)   End Sub   Private Sub foo(ByVal hoga As integer)     '処理   End Sub   --------------------------------- 現在、(b)のようにあえて引数を設定したほうが、呼び出し先のメソッドがどういう処理を行っているかを掴めていいかな?と考え始めています。 ご助言よろしくお願い致します。

  • rubyでメソッド内で引数名、値を取得

    Rubyでメソッドの引数名をメソッド内部で取得するような事は可能でしょうか? def hoge(a,b,c) # ここでa,b,cの引数名、またその値を取得 # 例えば、{:a=>1, :b=>2, :c=>3}のようにHashの形式で得るなど。 end local_variablesだと、引数も含まれますがその他で定義したものも拾ってしまうため、他の方法を探しています。 わかる方がいれば教えていただけますでしょうか。

  • vb.net Charsメソッドについて

    vs2008、.NET Framework 3.5 にてvb.net の勉強をしているのですが、 下記のような場合にビルドエラーにならないことについて 疑問があります。 Public Class ClassA   Private Sub methodA()     Dim a As String = getString(1) ・・・★   End Sub   Private Function getString() As String     Return "abcdefg"   End Function End ClassA getStringメソッドには引数をとらないもののみが定義 されているので、methodAからgetStringメソッドを呼び出した 場合(★)は、ビルドエラーになると思うのですが、なりません。 a の値は"b"になります。 調べてみたところ、引数に1を設定したことによって、 Charsというメソッドが呼ばれているようなのですが、 それであれば、 Dim a As String = getString().Chars(1) と書くものだと思うのですが…。 こういう書き方もできるんだという話であればそれまでなのですが、 どうも腑に落ちないので、説明できる方がいらっしゃれば 教えていただきたいです。

  • メソッドの作成基準について

    現在、Webアプリを開発しているのですがメソッドを作成するにあたり いつも悩むことが下記2点あります。 どういう基準で判断すればよいのでしょうか。 正解の判断基準ってあるのでしょうか。 1. メソッドをStatic なメソッドにするかインスタンスメソッドにするか。 2. メソッド内の処理に必要な数値を引数で取得するかセッションから取得するか。   2.についてはセッションから値を取得するようにすれば引数の無いメソッドが できて便利かもと思ってはいるのですがこの考えは正しいのでしょうか。

    • ベストアンサー
    • Java
  • メソッドの中に、作ったメソッドを呼び込みたいんですが

    メソッドの中に、作ったメソッドを呼び込みたいんですが シグネチャを int argCheck(String args[]) に指定して、 引数のチェック処理メソッドというものを作成してるんですが、 よくわからないんです。 内容は (1) 引数の数が1個でない場合、1を返却 (2) 引数が『aaa』でも『ZZZ』でもない場合、99を返却 (3) 以外は、0を返却 public class Test { public static void main(String args[]) { Test test = new Test(); int result = test.argCheck(args); test.argCheck(); //メソッドを呼び込み } private int argCheck(String args[]) { if(args[0].length != 1) // 引数の数が1以外の場合 { return 1; // 1を返す } else if (!args[0].equalsIgnoreCase("aaa") && !args[0].equalsIgnoreCase("ZZZ")) //引数が aaa でも ZZZ でもない場合(大/小文字区別せず) { return 99; // 99を返す } else // それ以外の場合 { return 0; // 0を返す } } }

    • ベストアンサー
    • Java
  • クラスやメソッドが理解できません

    今javaを勉強中なのですが、クラスやメソッドで生きず待ってしまいました。 メソッドの定義は 戻り値の型 メソッド名(引数リスト) {  文;  ・・・ return 式;  } ですが、メソッドから返されえる値を戻り値といますよね?呼び出し元に値を返すってどういうことなのでしょうか? int getNum() { System.out.println("調べました") return num; } たとえば、上記のようなものですが。もしも、このメソッドを呼び出すと、”戻り値”が戻ってくるわけですが、これはgetNumという変数のなかに計算式が入っている?という考え方でいいのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Java
  • クラスメソッドの仕様

    次のようなクラスメソッドを作りたいのですが、自分で作って見たところ、どのような点を修正すればいいか分かりません。 どうか教えてください。 (1) 次に示す内容を満たすバー(Bar)クラスを作成せよ。 1. バーの右端のx座標(=バーの長さ)、バーの名前を扱う2つのprivateなインスタンス変数を持つ。 2. バーの総数を扱うprivateなクラス変数を持つ。ただし、 ここでいう総数とは、(1)コンストラクタで作成したもの、(2)代入操作で作成したもの、の両方を含む。 3. 引数無しのコンストラクタが呼び出されてバーオブジェクトが作成されると、そのバーのx座標は0以上400未満でランダムに決定され、名前は文字「A」とランダムに決定された0以上10000未満の整数が連接されたものに決定される。 4. バーのx座標を設定するインスタンスメソッドを持つ。 5. バーの名前を設定するインスタンスメソッドを持つ。 6. バーのx座標を取得するインスタンスメソッドを持つ。 7. バーの名前を取得するインスタンスメソッドを持つ。 8. 作成されたバーの総数を取得するクラスメソッドを持つ。 9. 作成されたバーの総数を1増やすクラスメソッドを持つ。 10. 作成されたバーの総数を1減らすクラスメソッドを持つ。 これを自分なりに解釈したところ、 class Bar{ private int x; private String name; private int count; private Bar(){ x=0; count=0; name=""; } public void Bar(){ x = (int)(Math.random()*400); name = "A" + (int)(Math.random()*10000); } public void setBar(int bx){ x=bx; } public void setName(String nm){ name=nm; } public void getX(int bx){ } public void getName(String nm){ } public void getCount(int c){ } } どうか御教授お願いします。

  • ~クラスのメソッドと言った場合継承したものを含むか

    お世話になります。 OJC-Pの勉強中、以下の模試問題が出題されました。 ------------------- Threadクラスのメソッドとして正しいものを全て選びなさい wait() notify() run() start() ------------------- 解答はrun()、start()の2つだったのですが、 この場合、Objectクラスから継承したメソッドは Threadクラスのメソッドとは言わないのかを疑問に感じました。 (外部クラスから見た場合、 継承したメソッドもThreadクラスで新しく定義されたメソッドも区別は ないのでは、と考えたためです。) 問題文の表現に不備があるのでしょうか、 それともやはり 「~クラスのメソッド」と言った場合、継承したものは含まないとするのが 一般的な解釈なのでしょうか。 また、後者の場合、それはどうしてなのか理由なども添えていただけると 嬉しいです。 よろしくおねがいいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう