• ベストアンサー

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

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

  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • unokwave
  • ベストアンサー率58% (966/1654)
回答No.2

それはグローバル変数やメソッドの位置づけに依ります。 例えばPiのような確定している定数による処理をする事が決まっているメソッドであれば引数にするだけ無駄です。 一方で将来的に係数を変え汎用に使用する事を想定しているメソッドの場合、グローバル変数という単一の物に縛られる実装をするのは馬鹿げています。

unko347
質問者

お礼

汎用使用するかどうかを考えながらメソッドを作成していきたいと思います。 ご回答ありがとうございました。

その他の回答 (1)

  • unokwave
  • ベストアンサー率58% (966/1654)
回答No.1

1)staticなメソッド staticなメンバー変数に対する処理を自クラスの全インスタンス共通で処理する必要がある場合 2)引数 メソッド自体の引数はなくしてもセッション参照のためにメソッド内部で引数を使用してますよね。 もしセッション参照の為に引数が使えなかったら、どうやってセッションを参照すると思いますか。

unko347
質問者

補足

ご回答ありがとうございます。 2. の件ですが挙げた例が悪かったので訂正します。 もし、メソッドの中でグロバールスコープの変数を参照できる場合、 下記例のtest(), test2()のどちらの方式でメソッドを作るのが良いのでしょうか。 グローバルスコープで数値を取得できるのだからわざわざtest2()のように引数で で与える必要はないと思うのですが、今まで、test2()のように引数で取得している ようなコードを何度も見たことがあったので疑問に思い質問してみました。 function test() { a = GLOBAL_NUM * 100; b = GLOBAL_NUM2 * 200 } function test2(var global_num, var global_num2) { a = global_num * 100; b = global_num2 * 200; }

関連するQ&A

  • staticメソッドにするかどうかの判断

    staticメソッドの使いどころについて質問させてください。 まず、メソッドの内部で、そのメソッドが定義されているクラスのイ ンスタンス変数を使用している場合は、そのメソッドはインスタンス に依存するので、インスタンスメソッドにしかできないのはわかり ます。疑問なのは、「じゃあこのメソッド内でインスタンス変数を使 わないで引数で渡せるように作れば、インスタンスに依存しないの でstaticにしていいの?」(※)ということです。 さらにこうも思います。 なんとなくですが、※のようなことをしたらオブジェクト指向の意味 がない気がします。理由ははっきりわかりません。ほんとになんとなく です。(奇跡的にあたっていたとしても、理由を教えて下さいm(_ _)m) そして、さらに混乱するのが、ユーティリティの関数などでstaticメ ソッドになっているのを見ました。この場合はどうしてメソッドの引 数を指定するようにしていて、クラスのインスタンス変数を使うこと はしないのか。 以上、大変下手な文章ですが、混乱しているポイントが伝わったでし ょうか? よろしくお願いします。

  • Java 静的メソッドとインスタンスメソッド

    静的メソッドとインスタンスメソッドの使い分けがよくわかりません。 私の認識は 静的メソッド:インスタンスメンバ変数を参照する必要がない処理 インスタンスメソッド:インスタンスメンバ変数を参照して行う処理 と思っています。 よって、例えばDAOを作成する場合、select、update、insertを実行するメソッドを作成しますが、これらはクラスのインスタンスメンバ変数を参照する必要がないので静的メソッドにするべきだと思っています。 しかし、本やネットのDAOのサンプルプログラムはインスタンスメソッドで作成されています。 これらは、private static String の変数(SQL文が記述されている)を参照していますが、インスタンスメンバ変数は参照していません。 なぜselect、update、insertのメソッドをインスタンスメソッドにする必要があるのかわかりません。 静的メソッドとインスタンスメソッドの使い分けの基準を教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • メソッドの呼び出し方(static参照したくない場合は??)

    いつもお世話になっております。 いつまで経ってもJavaが理解できないでいる初心者tak315です(涙) 今作っているWebアプリで、開発者全員が使う共通クラスがあります。 メソッドを呼び出したいのですが、 *-------------------------* 型 [クラス名] から非 static メソッド [メソッド名]に static 参照することはできません。 *-------------------------* というエラーがでます。 どちらもstaticじゃないので、そりゃそうなんでしょうが、 static参照しない場合の呼び出し方がわかりません。 eclipseのアシストだと、呼び出し元をstaticにすればいいじゃん。 と言われるのですが、共通クラスなので、勝手に変更できません。 メソッドの呼び出し方自体まだよくわからず、 大変困っております。。。 [クラス名] [小文字クラス名] = new [クラス名].[メソッド名()]; なんて書けば使えるんじゃ…と思ったけど、使えませんでした。 なにぶん、Javaをわかっていないもので、 説明不足なところがあるかも知れません。 補足でいくらでも答えますので、 足りていない説明などもご指摘いただければありがたいです。 そして、やさしく教えてほしいです。。。 どうか、よろしくお願い致します。

    • ベストアンサー
    • Java
  • インタフェースのメソッド

    最近仕事でJAVAを使うことになり勉強し始めたのですが、分からないことがあります。 たとえばHTMLからPOST要求を受けるサーブレットでセッションを取得する際、 doPost(HttpServletRequest req , HttpServretResponse res){ HttpSession session = req.getSession(true) … } としますが、このgetSessionメソッドの中身はどこで実装されているのですか?reqインスタンスはHttpServletRequest型としか指定していませんが、HttpServletRequestはインタフェースなのでメソッドの実装をしていないと思うのですが・・・。 知らなくても「こうするものだ」と思っておけば問題はないのでしょうが、しっかり理解しておきたいのでよろしくお願いします。

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

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

    • ベストアンサー
    • Java
  • staticのメリット、デメリット

    こんばんは。 staticについて、だんだんわからなくなってきました・・・。 例えばあるクラスの変数で、 static int i = 10; とあった場合、参照クラスからiの値を見ると、必ず10ですよね? static修飾子がついているメソッドの場合、挙動はどうなるのでしょう? staticなメソッドはインスタンス化しなくても呼び出せる。 つまり、メモリ上に1箇所しか存在しないので、同時にアクセスされた場合(synchronizedしていない場合)はどうなるのかがわかりません・・・。 メソッドには引数が存在し、returnがStringやintなどの場合です。 returnは保証(参照側にとって望む値と言う意味で)されるのでしょうか? インスタンス化をしない事によって、パフォーマンスが向上するのでしょうけれど、いまいちメリットがわかりません・・・。 public、privateにかかわらず、メソッドをstatic修飾するメリットを教えてください。 同時にデメリットもお願いします。 以上、下手くそな文章ですみません・・・。 (^^ゞ

    • ベストアンサー
    • Java
  • メソッドを使ったプログラム

    メソッドをつかったプログラムで数当てゲームを作成したいのですが 1から1000までのランダムな値(以降 数値X として)を取得し、プレイヤーにその数を当てさせる。 プレイヤーが入力した数値(以降 数値Y として)が数値Xより大きければ『もっと小さいです』、数値Yが数値Xより小さければ『もっと大きいです』と出力する。 数値Xと数値Yが同じになるまで繰り返し、何回であったたかを最後に表示する。 条件:以下の処理の単位をメソッドにする。   1.1から1000までのランダムな値を取得する。   2.数値X、数値Yの関係(大小、等しい)を調べ、適切なメッセージを出力する というプログラミングを作成したいのですがどういうふうにしたらよいのかわかりません!! import java.io.*; class Question7_2{ public static void main(String[] args){ BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); try{ System.out.println("数当てゲーム"); というところでとまった状態です。どのようにしたらよいか教えてください!例外発生やIf文を使うというのまではわかるのですが…

  • メソッドにより複数の情報を得たい場合

    例えば、他のクラスのメソッドに何らかのインスタンス配列を渡してやって、その中から何らかの基準で選択して要素を返すようなメソッドを考えます。 さらに、同時に配列のどの位置が選ばれたのかを知りたい場合は、みなさんならばどう対処しますか? class Hoge{} class A {  public Hoge select(Hoge h[]){   return h[(int)(Math.rand()*h.length)];  } } class Test{  public static void main(String argv[]){   A a = new A();   Hoge hoge[] = new Hoge[100];   Hoge h = a.select(hoge);//同時にどの位置が選択されたかも知りたい  } } 上の例だと、「最初から選択された位置を返して、それからHogeインスタンスを得ればいいじゃないか」という話もごもっともなのですが、もし仮にJavaがポインタを許すと仮定した場合の Hoge select(Hoge h[], int *n){   return h[*n = (int)(Math.rand()*h.length)]; } Hoge h = select(hoge, &idx); に代わるような方法はないものかなぁ。。 という素朴な疑問から質問をしてみました。 考え付いた方法は、サイズ1のint配列を引数に渡して値をセットするか, 欲しい値などをメンバにもつクラスを定義してやって、それを select から返す方法か・・くらいです。 みなさんならこういった場合(メソッドにより取得したい値がいっぱいある場合) 、どうしますか?

    • ベストアンサー
    • Java
  • Cake2系のコントローラでセッション情報取得

    CakePHP2を使用して、開発を行っているのですが、 AppControllerを継承したControllerのあるメソッドで、 別のコントロー(AppController継承)をnewでインスタンスを生成し、 自前のコントローラのあるメソッドを呼び出しているのですが、 自前のコントローラのメソッド内で、セッション情報取得しようとすると 「Call to a member function load() on a non-object」 となりエラーになります。 AppControllerには、コンポーネントの呼び出しを行っています。 public $components = array('Common','Session'); newして使わないコントローラだと、セッション情報を取得できるのですが、 newしたコントローラでは、セッション情報にセットした情報を取得することができません。 newしたコントローラへ必要な情報を渡すには引数以外はないのでしょうか。 セッション情報をnewしたコントロールで取得したいのですが、 可能でしょか。

    • ベストアンサー
    • PHP
  • 計算クラスのメソッドについて

    <問題> Mainクラス mainメソッド 1)実行時に引数を2つ付けて実行する。(数字) 2)計算クラスのオブジェクトを生成。 3)argsの0番目と1番目から値を取得し、int型に変換する。 4)int型に変換した値2つを引数として、計算クラスの足し算メソ   ッドを実行し、戻り値を取得して表示する。 計算クラス 足し算メソッド(引数=int,int) 1)int型の数字を引数として2つ受け取る。 2)二つの引数の値を足し算する。 3)計算した値を戻り値とする。 *********************************************************** 上記の問題についての質問です。 最初mathくらすのメソッドを使うのかと思ったのですが、 足し算を計算するようなメソッドが無かったのでネットで検索 して見つけたcalcAdd()というメソッドを使って記述してみました。 でも「シンボルを見つけられません」のエラーが出てコンパイル 出来ないし、メソッドの使い方も違うような気がするので、 分かる方正しい記述の仕方を教えてください。 package siryou; class Keisan { int cal; int cul; public int tashizan(int a, int u) { cal = a; cul = u; int kekka = (Integer)calcAdd(cal, cul, 0); return kekka; } } class TashiHikiKakeWari { public static void main(String args[]) { Keisan ki = new Keisan(); String str1 = args[0]; String str2 = args[1]; int res1 = Integer.parseInt(str1); int res2 = Integer.parseInt(str2); ki.tashizan(res1, res2); int kekka = ki.tashizan(res1, res2); System.out.println(kekka); } } ************************************************************ calcAdd()メソッドの呼び出し方も間違っている気がするのですが、 そもそもこのメソッドって呼び出せば自動的に計算されるように なっているのですか? それとも足し算を計算する記述は別にしなければならないのでしょうか?

    • ベストアンサー
    • Java

専門家に質問してみよう