• 締切済み

クラスについての質問

私はゲームを作っています。作り始めのころクラスの存在を知らずに めちゃくちゃに組んでいたのですが、最近になってクラスを使わないと 不便だという事に気が付きました。現在クラスを使用して修正中です。 クラスについて調べている時に、クラスの中のメンバの値を変える時は そのクラスの中でしか変えてはいけない、ととあるサイトで見かけました。 更にクラスのメンバはなるべくpublicで宣言してはいけないとも見かけました。 そこで気になったのですが、クラスの中のメンバの値をクラス外の 変数やクラスのメンバ等に代入したい時はどのようにすれば良いのでしょうか? クラス外でメンバを参照するにはpublicで宣言しなければなりませんし、 クラス内に変数をアドレスで引き渡して代入してしまうと、クラス内でしか 値を変えてはいけないということを守れなくなってしまいます。 このような場合はどのようにして値を代入すれば良いのでしょうか? 返答をお願いします!。

みんなの回答

  • a_kwn
  • ベストアンサー率34% (8/23)
回答No.4

混乱させたようですいません。 言いたいことは、次の2点です。 ・getter/setter を使う方が、public なメンバー変数よりもお行儀がいい。  なぜなら、メンバー変数へのアクセスをそこに限定でき、何らかの機能(チェックなど)  を行わせることができるから。 ・でも、他の方が指摘しているように、単純な getter/setter にしかならない場合には、  よりよい設計が存在することが多い。  なので、単純な getter/setter にしかならない場合は、今一度クラス設計を  見直した方がよい。   クラスには何らかの役割を担わせるべきであり、単純に 「値を設定して!」、「設定した値を教えて!」 という役割の比重が高いクラスというのは、クラス設計だったり、IFの粒度だったりが 間違っているのでは? ということです。

Uriaria
質問者

お礼

なるほど!メンバ変数の値をそこだけしか扱えないとわかっていれば(クラス外では) たしかに変なミスや探すのに手間取らなくなりそうですね。 そういえばクラスのまとめるという目的をすっかり忘れていました。 本来わかりやすくまとめるために作ったのに、変なまとめかたをしてしまったら 元のまとめる前と変わらないですね。 わかりやすく説明してくださってありがとうございました。 クラスについて多少ですが理解することができました。

  • a_kwn
  • ベストアンサー率34% (8/23)
回答No.3

まず、public 変数の使用を控えて、とりあえず、getter / setter に置き換えることをお勧めします。 そこで、もし、 ・外部から setter で値をセットされ ・その値が何の加工もせずに、他のインスタンスに getter で参照される んだとしたら、「ちょっと待てよ。本当にこれでよいのか?」と考えてみてはどうでしょうか? その、setter/getter が呼ばれている前後の処理等が本来ならば、その変数に対する管理や処理の対象であり、本来クラスの有すべき機能であることは、よくあることです。 そういった修正の先に、さらに、本来のクラスの持っているべきインターフェイス仕様はこうだったのでは?という高さまで、いずれは到達できると思います。 ここまでくれば、単純な getter / setter の仕組みからおさらばです。 まぁ、実業務では、結構何も考えずに getter / setter 使いますけどね…。

Uriaria
質問者

お礼

回答ありがとうございます! う~ん、わかったようなわからないような・・・ getterとsetterを使うことによってそこを元に 調べることができて、最終的にそのクラスの全体像が 確認できるということですか?

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.2

あなたの脳内にメンバ変数nicknameが存在して値"Uriaria"が格納されているイメージを想像してください。 あなたは通りすがりの誰彼かまわぬ不特定多数(public)がいつでも閲覧できるよう,メンバ変数nicknameへのアクセスを公開しているでしょうか。おそらくそうではないでしょう。 あなたは自分の脳内の特定アドレスへのアクセスを他人に許可して,自分の脳内のnicknameの内容を他人が自由に変更できるよう侵入を許しているでしょうか。おそらくそうではないでしょう。 あなたはおそらく, 「名前を教えて」という他人からのメッセージがあったなら,自分自身がそれを許した場合だけ,自分で「私は"Uriaria"です」と答えるでしょうし, 「名前を"airairu"に変えてみたら」という他人からのメッセージがあったなら,自分自身がそれを許した場合だけ,自分でnicknameの値を"airairu"に変更するでしょう。 ということで, > 通常はgetterやsetterと呼ばれるメソッドを用意します。 > メソッドを介すことで予期しない操作を防ぎます。 という,ANo.1のポイントを比喩を用いて言い換えてみました。 > 現在クラスを使用して修正中です。 とのことですが,今回のような質問が出てきているということは,それはコード上はクラスの形をしているけれど,クラスの意味を成していない可能性が高いです。 これまたANo.1にて指摘されているとおり,オブジェクト指向プログラミング(Object-Oriented Programming)の基本概念を先にざっと学習した方が早いですよ。

Uriaria
質問者

お礼

返答ありがとうございます! とても解りやすい例えです。 私をクラスと考えて見たところ、ほとんどがprivateでした。 クラスは現実と似ていますね。 NO1さんやNO2さんの言う通りオブジェクト指向の基礎についてキチンと調べてみたいと思います!。 ありがとうございました。

  • ttnnkkyy
  • ベストアンサー率26% (255/979)
回答No.1

通常はgetterやsetterと呼ばれるメソッドを用意します。 メソッドを介すことで予期しない操作を防ぎます。 ただし、何も考えずに用意してしまってはいけません。 その実装良いのか、本当にpublicにして良いのか、そもそも必要なのか、よく考えるべきです。 細かいことは検索すれば沢山出て来ますが、そもそも「OOPとは何なのか」から理解しないと難しいですよ。

Uriaria
質問者

お礼

返答ありがとうございます! なるほど、そんなメソッドがあるのですね。早速調べてみたいと思います。 オブジェクト指向の基礎を覚えていなかったので、これから調べてみます。 ありがとうございました。

関連するQ&A

専門家に質問してみよう