クラスのメンバー変数の書き方

このQ&Aのポイント
  • クラスのメンバー変数を書くときのprivateの書き方やnull初期化の書き方、接頭辞の使用についての統一方法について教えてください。
  • privateの明示的な書き方やnull初期化の明示的な書き方は、Javaに不慣れな人にもわかりやすくすることができますが、タイプ数が増えてコーディングがやや面倒になります。
  • 接頭辞の使用は、thisを書かなくて済むためコーディングが楽になりますが、なんだか気持ち悪く感じる人もいます。デメリットは明確ではありません。
回答を見る
  • ベストアンサー

クラスのメンバー変数の書き方。

クラスのメンバー変数の書き方。 クラスのメンバー変数を書くとき、以下の3つはどちらでも同じ動作をします。 ◆privateの場合、privateを明示的に書く or 書かない ◆null初期化の場合、= nullを明示的に書く or 書かない ◆メンバー変数名に接頭辞(mTextなど)をつける or つけない チームなどで書き方をどちらかに統一するとすれば、どちらに統一するのがいいと思いますか。 理由も含めて教えて下さい。 明示的に書くとJavaに不慣れな人にも分かりやすくて良いと思います。 書かないとタイプ数が減ってコーディングが若干楽です。 接頭辞はthisを書かなくていいのが楽なのですが、なんだか気持ち悪いです。 気持ち悪いのですが、デメリットは明確に説明できません。

  • Java
  • 回答数3
  • ありがとう数6

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

  • ベストアンサー
回答No.3

◆private を明示的に書かないと、private になりません ◆null初期化の場合、 null初期化を明示的に書くことで、設計上の特別な意図を他の人に知らせる必要がある場合は書きます 特に設計上の特別な意図が無い場合は、書きません (コードはいつもクリーンな状態を保つ、不要なものは書かない) ◆接頭辞はつけない 接頭辞なんかよりも、変数名は、変数の意味がほぼ完全に把握できるものにします (SunのNaming Conventionに従う) public class CourseSession { private int numberOfStudents; public int getNumberOfStudents(){return numberOfStudents;} } ★インスタンス変数は必ず private にする オブジェクトに対して、メッセージを送信する以外の事を許可してはいけません。 this.doSomeThing(); についても、thisオブジェクト(自分自身)に対して、doSomeThingというメッセージを送信すると捉えます。

zigzagfire
質問者

お礼

回答ありがとうございます。 >private を明示的に書かないと、private になりません 勘違いしていたようです。ご指摘ありがとうございます。 >特に設計上の特別な意図が無い場合は、書きません >コードはいつもクリーンな状態を保つ、不要なものは書かない 確かに納得いきます。同意です。 >接頭辞なんかよりも、変数名は、変数の意味がほぼ完全に把握できるものにします 意味がほぼ把握できるのがいいというのには同意ですが、 接頭辞をつけない理由はやっぱりいまいち分かりません。 例えば、mNumberOfStudents でも意味は分かるしいいんじゃないかとも思います。 >インスタンス変数は必ず private にする 「必ず」と言うとちょっと言い過ぎかと思いますが、概ね同意です。

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

privateは#1さんの言う通り、書かないこととprivateは同義ではありません。 nullはどちらでもいいけど、個人的には書く方を選ぶ。 接頭辞は、thisを書かなくてよいのは、他の変数に同じ接頭辞を使わない、というルールに従ったときだけです。 逆に、他で使われていなければ、接頭辞を使わなくても、thisを使わずに直接メンバ変数にアクセスできます。 「接頭辞を使えばthisをかかなくてよい」というのは間違いです。 個人的には、接頭辞は基本使わない+thisを必ず指定する。 あるいは、 privateなメンバ変数(接頭辞あり)とアクセサ(接頭辞無し)の組み合わせを使う 例) private int mx ; public int x() { return this.mx ;}

zigzagfire
質問者

お礼

回答ありがとうございます。 >「接頭辞を使えばthisをかかなくてよい」というのは間違いです。 そうなのですが、メンバー変数の接頭辞は"m"で、 他の変数に同じ接頭辞を使わないというようなルールがある場合の話です。 thisを使わずアクセスできるのも知ってますが、 引数やローカル変数と混同するのが恐くて、接頭辞が無いと全部thisをつけたくなってしまいます。

回答No.1

こんにちは。 ◆privateの場合、privateを明示的に書く or 書かない 書きます。 理由 何も書かない場合はprivateではありません。 ◆null初期化の場合、= nullを明示的に書く or 書かない 書きます。 理由 なんとなく気持ち悪い・・・。 ◆メンバー変数名に接頭辞(mTextなど)をつける or つけない 付けない。 理由 別にいらんと思う・・・好み。

zigzagfire
質問者

お礼

>何も書かない場合はprivateではありません。 デフォルトはprotectedですね。privateなのはC#でした。 >なんとなく気持ち悪い・・・。 気持ちは分かるんですが、 書かないとnullって決まってるし、書かなくてもいいかなあとも思います。 >別にいらんと思う・・・好み。 Javaで接頭辞をつけてるのはあんまり見ないですが、慣れると便利ですよ。

関連するQ&A

  • クラスのメンバ変数のnew

    こんにちは。 クラスのメンバ変数の動的割り当てで困っていることがあります。 コンストラクタ内でメンバ変数に動的割り当てをするんですが、そこで例外処理をしなければならないようです。 例 class foo::foo() { try{ hoge = new int[100]; // hogeの代入処理 // } catch { delete[] hoge; hoge = NULL; } } foo::~foo() { delete[] hoge; hoge = NULL; } しかしこれだと不十分なようで、なかしかの対策をしないとメモリリークが起きてしまいそうなんですが どのようにやるんでしょうか?

  • クラスメンバの中で配列を利用したい

    Cで書いたプログラムをC++に移植してます。 普通の変数はクラスメンバに置き換えてしまえばよろしいのですが、 配列の場合そのままクラスメンバに置き換えたら 問題が発生します。(予想はついていたのですが…) class test{ private: int m_test[100]; }; クラスメンバを配列に設定するにはどうすればよいですか?

  • クラスがメンバーとしてクラスを持つ時の宣言について

    自作クラスMainClassがMyClassというクラスをメンバー変数として持つ場合、宣言時に引数をいくつか持つコンストラクタを呼び出そうとすると構文エラーとなります。 class MyClass { public: MyClass(int, int); } class MainClass { private: MyClass myclass(10,10); } このような宣言はできないのでしょうか。 引数なしのコンストラクタは呼び出せているようです。

  • privateのメンバ変数を直接取得するユーティリティ。

    privateのメンバ変数を直接取得するユーティリティ。 以前、あるプロジェクトでクラスのprivateメンバ変数をgetterメソッドがないのに直接取得できるクラスを使っているのを見ました。 オブジェクトとメンバ変数とかを引数に渡すと、Object型で返却されるようなテスト用のユーティリティクラスみたいでした。 クラスやパッケージなどを確認しなかったので、もしかしたらそのプロジェクトで独自に作ったのかもしれません。 ただオープンソースとかで存在するのであればテストに便利なので利用したいと考えています。 できればsetterメソッドがないprivateメンバ変数に設定できるクラスがあるとよいのですが・・・。 ご存知でしたら是非おしえてください。 希望している経緯はWebアプリケーションのクラスを作成すると、コンテナのオブジェクトがないと動かない場合も多く、単体試験がやりにくいのです。 easymockなど色々ありますが、生成したオブジェクトを対象クラスに渡してあげる必要があるものが多く(staticメソッドは対象外とか)、テストのためにsetterメソッドを実装する必要があります。 個人的には単体試験をやりやすくするために、本番では使用しないメソッドになるけれど、上記のようなsetterメソッドを作成するのはよいと考えています。 依存性を少なくさせて(意味が違うかもしれませんが)、試験がしやすくなれば保守性もあがるし、バグの発生率も少なくなると思っています。 ただ人によっては本番で動かないメソッドがあるのはおかしいという人もいます(実際に言われました)。 確かにそういう考えもあるかと思いますし、以前は私もそう思っていました。 試験のためのメソッドをクラスに作成する考えについても(主にテスト用なのでprotectedで作成しています)、やめた方がいいなどのアドバイスを頂けると嬉しいです。

    • ベストアンサー
    • Java
  • Javaのクラス内メンバの命名についてアドバイスを頂きたいです。

    Javaのクラス内メンバの命名についてアドバイスを頂きたいです。 Eclipse3.6にてJavaプログラムをしています。 普段、メンバを参照する時には"this.~~"と書いています。 ですが、この方法では入力候補(Eclipseの機能)を2回選択する動作が必要で、メンバへの参照が多いクラスだと若干手間な気がしました。(入力候補表示が重い時もありますし) 自分ではできるだけコーディングスピードを上げたいと思っていて、メンバ名や設定の工夫で改善したいと思っています。 そこで、コーディングスピードを上げるために命名(メンバ名に限らず)・設定で工夫されているところはありますでしょうか? 「そんなの、めんどくさがりなだけだ」とか「this.は明示しておく理由がある」と言われればそれまでですが… ご教授ください。よろしくお願いします。

  • 【設計思想の質問】staticメソッド、メンバ変数

    【設計思想的な質問】 自分は、結合が弱いソースを好んでおり、 以下の例で言えば、後者のようにするのですが、 このようは書き方は良くないのでしょうか? 新しい現場で、後者の方の書き方をしたら、 「えっ、なんでメンバー変数で宣言してんの? なんで引数で渡してんの?馬鹿じゃないの?」 と、結構、傷つく言葉を受けました。 それはそうとして、 自分としては、「なぜ、やってはいけないのか?」 「自分の設計思想は、設計の方向性としてアリなのか?」などを知りたく、質問させて頂きました。 ご意見、ご鞭撻を宜しくお願い致します。 //----------------------------------------------------------- ★前提1:末端の派生クラスで、このクラスを継承することはない。 ★前提2:提供する処理は様々な処理で使われるユーティリティ機能 ◆案1 class 複雑なクラス //メンバ変数  変数1  変数2  (中略)  変数100 //メソッド private  long 複雑な処理 (void)      (略:色んなメンバー変数が登場するが、       どのメンバと、どのメンバが登場するかは、ソースを追いかけて確認する)  long 自由なタイミングで、色んなメンバ変数の値を書き換えてしまうメソッド (void)       (※上述の「複雑な処理」に登場する変数の取りうる値がフリーダムになる) となるよりも、 //----------------------------------------------------------- ◆案2  static long 複雑な処理 (必要な引数1、必要な引数2、必要な引数3)    (略:登場するINPUT、OUTPUTは、引数に列挙されているものだけ。)  static long 複雑な処理 (必要な引数97、必要な引数98、必要な引数99)    (略:登場するINPUT、OUTPUTは、引数に列挙されているものだけ。)  ※渡す値は、呼び元が意識するため、メンバ変数がどういう状況になっているかは、   メソッドの利用者が把握している。(タイミングも、取りうる値も、認識しやすい) の方が良いという考えなのです。 メンバ変数で書けば、確かに、宣言部、定義部のコーディングで引数のことを書かなくてよいので楽でしょうし、 インタフェースの検討不足で手戻りがあっても、引数の増減で、修正が不要ですし、楽だと思います。 しかし、 「どこからでもアクセスできる変数ばかり」だと、処理の認識も困難だし、バグの温床にもなってしまうことから、私は後者にも、優れている部分はあると考えているのです。 .

  • クラスにおける、メンバー変数の「$」の有無について

    クラスについて学習中です。 テキストに載っていた、以下のサンプルスクリプトについて質問があります。 (他言語の方々へ。PHPは特に指定しなかった場合、アクセス制限はpublicです) <?php class Book { var $name=""; function Book($name) { $this->name=$name; //6行目【注1】 } function display() { if ($this->n=="phpの本") {   //10行目 $file="php.txt"; echo join(file($file)); } else { echo "本がありません"; } } } $obj=new Book("本の名前"); //display()というメソッドを呼ぶ $obj->display(); //nameというメンバー変数を読み込む  echo $obj->name; ?> 今回の疑問・質問のスタートは6行目【注1】の箇所でした。 『疑問1』 nameと$nameは別物なんだろうか?(「=」で結べば中身が同じになるのは当然ですが、それ以前の概念?の話です) 『考察(予想)1』 おそらく別物だろう。もし同一なら6行目の式が意味を成さない(不要)だろうから。 『疑問2』 別物であるなら「name」とは何なのだろう?「メンバー変数」というものであることは知ったが、(関数や定数ではなく)変数の一種なのに、なぜ「$」が無いのだろう? 『考察(予想)2』 クラスやオブジェクトの記述で、「$this->」や「$obj->」などの後に続く場合は$を書かずに「メンバー変数」とすることが決まっている!?もしここに「$」を付けてしまうと、それは「$name」となってしまい、考察1と矛盾することになるから、おそらく、「決まり」なのだろう!? 『疑問3』 「$name」については3行目においてメンバー変数であることを宣言しているのに対し、「name」について宣言しないのはなぜだろう。 『考察(予想)3』 試しにnameについても「var name;」と書いてみたらエラーになった。やはり最初に宣言するときは「$」が必要なようだ。そうすると・・「$name」と書くはめになり、考察1と矛盾してしまう。 よし。試しに($nameではない)「name」の箇所を「nnnn」としてみよう。 (6行目、10行目、下から2・3行目の4箇所) こう変更してみても同様に動いたことで、「name」と「$name」は綴りを同じにしてるだけの別物だろうなのだろうと理解したつもりになりました。 そして、事前に「nnnn」を(var $nnnn;と)メンバー変数宣言することが可能であることも、もしくは「var $name;」を省略しても同様に動くことを確認しました。 ところが同時に新たな疑問が湧きました。 『疑問4』 「nnnn」を事前に宣言するときは「var $nnnn;」と、「$」を付けないとエラーになる。・・・え?とすると、元の「name」と「$name」の場合のスクリプト3行目の「var $name;」というのは、「name」について宣言してるのか、それとも「$name」について宣言してるのかどっちなのだろう?・・・同じこと?ってことは『考察1』の「別物である」は誤りなの?でもnameを「nnnn」と変えても同じように動くんだよね?・・・何がなんだかわからなくなってきた。 という状態なのです。 どなたか、このモヤモヤっとした疑問を消してください。 お願いします。

  • ダイアログからビュークラスのメンバ変数へ代入するには?

    プログラミング初心者です. Visual C++.netを使っています. Viewクラスから,Domodal()にてあるダイアログを呼び出しました. ダイアログ上のあるボタンを押したら,Viewクラスのメンバ変数へ1を代入するという処理をしたいと考えています.  ラジオボタンやエディタコントロールであれば,DDXを利用すればよいと思うのですが,単なるボタンの場合はどうすれば,呼び出し元のViewクラスの値を操作(この場合,代入)出来るのでしょうか?

  • クラスの参照渡しとメンバ変数の速度は?

    ゲームプログラミングを勉強中の者です。 落ち物パズルゲームを作ろうとしているんですが、 現在、クラスの設計を ゲームステージのクラスがあり、そのクラスのメンバとして各プレイヤーのクラスを入れている、つまり //プレイヤーのクラス class Player{ (ステージなどのデータのメンバ変数) void showStage(); //このあたりが質問の内容です void update(); }; // ゲームステージのクラス class Stage{ Player p; //StageクラスのメンバとしてPlayerを含める (その他ステージのメンバ変数) void play(); // メインの関数 }; のようになっていて、 実行の際はStageクラスのplayの中にゲームの内容(入力、更新、表示のループなど)が全て入っていて、playの中で別の関数を呼び出したりしているのですが、 プレイヤーごとに処理した方が楽なもの、例えばプレイヤーごとの入力などは、今は関数playの中で void Stage::play(){ (中略) p.update(); (中略) } のように、StageのメンバのPlayerクラスのpからp.xxxという形で呼び出しています。 しかし、最近読んだ本では、 playerクラスはnewで作成して、こういう関数は参照渡しで実行する、つまり class Player{ (略) }; class Stage{ void player_update(player* p);  (略) void play(); }; void Stage::play(){ (中略) Player* p = new Player(); // プレイヤークラスを作成し (中略) player_update(*p); // 参照渡しする (中略) } とするべきのようなことが書いてありました。 updateの中ではかなりplayerのメンバ変数を参照・変更したりするのですが、両者の方法では後者の方が速さの面で有利なのでしょうか? 違いがあるとすれば、どの程度速さに影響するのでしょうか? ポインタを最近使い始めたばかりで記述自体合っているかあまり自信がないのですが、宜しくお願いします。

  • C++でfriendクラスにしているのにprivateメンバにアクセスできない

    C++でメンバ変数をprivateにして、特定のクラスにだけ公開するようにクラスをfriend指定したのですがprivateメンバにアクセスできませんとエラーが吐かれてしまいます。 先行宣言したりもしてみたのですがどうしても使用できません。 何か心当たりのあるかた教えてください。 class A { friend class B; private: int a; }; class B { public: void test( A *a ) { a->a = 0; } }; コードは違いますがこんな感じのことをしたいのです。 /* コンソールで小さなプログラムでテストしてみると動くのにいざ実際のソースに組み込むと動かないという奇妙な状態です。よろしくお願いします。 */

専門家に質問してみよう