
私はゲームを作っています。作り始めのころクラスの存在を知らずに
めちゃくちゃに組んでいたのですが、最近になってクラスを使わないと
不便だという事に気が付きました。現在クラスを使用して修正中です。
クラスについて調べている時に、クラスの中のメンバの値を変える時は
そのクラスの中でしか変えてはいけない、ととあるサイトで見かけました。
更にクラスのメンバはなるべくpublicで宣言してはいけないとも見かけました。
そこで気になったのですが、クラスの中のメンバの値をクラス外の
変数やクラスのメンバ等に代入したい時はどのようにすれば良いのでしょうか?
クラス外でメンバを参照するにはpublicで宣言しなければなりませんし、
クラス内に変数をアドレスで引き渡して代入してしまうと、クラス内でしか
値を変えてはいけないということを守れなくなってしまいます。
このような場合はどのようにして値を代入すれば良いのでしょうか?
返答をお願いします!。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
混乱させたようですいません。
言いたいことは、次の2点です。
・getter/setter を使う方が、public なメンバー変数よりもお行儀がいい。
なぜなら、メンバー変数へのアクセスをそこに限定でき、何らかの機能(チェックなど)
を行わせることができるから。
・でも、他の方が指摘しているように、単純な getter/setter にしかならない場合には、
よりよい設計が存在することが多い。
なので、単純な getter/setter にしかならない場合は、今一度クラス設計を
見直した方がよい。
クラスには何らかの役割を担わせるべきであり、単純に
「値を設定して!」、「設定した値を教えて!」
という役割の比重が高いクラスというのは、クラス設計だったり、IFの粒度だったりが
間違っているのでは? ということです。
なるほど!メンバ変数の値をそこだけしか扱えないとわかっていれば(クラス外では)
たしかに変なミスや探すのに手間取らなくなりそうですね。
そういえばクラスのまとめるという目的をすっかり忘れていました。
本来わかりやすくまとめるために作ったのに、変なまとめかたをしてしまったら
元のまとめる前と変わらないですね。
わかりやすく説明してくださってありがとうございました。
クラスについて多少ですが理解することができました。
No.3
- 回答日時:
まず、public 変数の使用を控えて、とりあえず、getter / setter に置き換えることをお勧めします。
そこで、もし、
・外部から setter で値をセットされ
・その値が何の加工もせずに、他のインスタンスに getter で参照される
んだとしたら、「ちょっと待てよ。本当にこれでよいのか?」と考えてみてはどうでしょうか?
その、setter/getter が呼ばれている前後の処理等が本来ならば、その変数に対する管理や処理の対象であり、本来クラスの有すべき機能であることは、よくあることです。
そういった修正の先に、さらに、本来のクラスの持っているべきインターフェイス仕様はこうだったのでは?という高さまで、いずれは到達できると思います。
ここまでくれば、単純な getter / setter の仕組みからおさらばです。
まぁ、実業務では、結構何も考えずに getter / setter 使いますけどね…。
回答ありがとうございます!
う~ん、わかったようなわからないような・・・
getterとsetterを使うことによってそこを元に
調べることができて、最終的にそのクラスの全体像が
確認できるということですか?
No.2
- 回答日時:
あなたの脳内にメンバ変数nicknameが存在して値"Uriaria"が格納されているイメージを想像してください。
あなたは通りすがりの誰彼かまわぬ不特定多数(public)がいつでも閲覧できるよう,メンバ変数nicknameへのアクセスを公開しているでしょうか。おそらくそうではないでしょう。
あなたは自分の脳内の特定アドレスへのアクセスを他人に許可して,自分の脳内のnicknameの内容を他人が自由に変更できるよう侵入を許しているでしょうか。おそらくそうではないでしょう。
あなたはおそらく,
「名前を教えて」という他人からのメッセージがあったなら,自分自身がそれを許した場合だけ,自分で「私は"Uriaria"です」と答えるでしょうし,
「名前を"airairu"に変えてみたら」という他人からのメッセージがあったなら,自分自身がそれを許した場合だけ,自分でnicknameの値を"airairu"に変更するでしょう。
ということで,
> 通常はgetterやsetterと呼ばれるメソッドを用意します。
> メソッドを介すことで予期しない操作を防ぎます。
という,ANo.1のポイントを比喩を用いて言い換えてみました。
> 現在クラスを使用して修正中です。
とのことですが,今回のような質問が出てきているということは,それはコード上はクラスの形をしているけれど,クラスの意味を成していない可能性が高いです。
これまたANo.1にて指摘されているとおり,オブジェクト指向プログラミング(Object-Oriented Programming)の基本概念を先にざっと学習した方が早いですよ。
返答ありがとうございます! とても解りやすい例えです。
私をクラスと考えて見たところ、ほとんどがprivateでした。 クラスは現実と似ていますね。
NO1さんやNO2さんの言う通りオブジェクト指向の基礎についてキチンと調べてみたいと思います!。
ありがとうございました。
No.1
- 回答日時:
通常はgetterやsetterと呼ばれるメソッドを用意します。
メソッドを介すことで予期しない操作を防ぎます。
ただし、何も考えずに用意してしまってはいけません。
その実装良いのか、本当にpublicにして良いのか、そもそも必要なのか、よく考えるべきです。
細かいことは検索すれば沢山出て来ますが、そもそも「OOPとは何なのか」から理解しないと難しいですよ。
返答ありがとうございます! なるほど、そんなメソッドがあるのですね。早速調べてみたいと思います。
オブジェクト指向の基礎を覚えていなかったので、これから調べてみます。 ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C言語】全角文字の配列を、全...
-
DLLファイルの逆コンパイラにつ...
-
C言語の関数のextern宣言
-
int16_t の _t は何?
-
C言語関数違いについて。
-
gccを行ってもexeファイルが生...
-
c言語
-
C#でTreeViewのCheckBoxのサイ...
-
ArduinoのジャイロモジュールMP...
-
VisualStudio2022でC言語プログ...
-
大量のデータを読み込んで表示...
-
プログラマー達は何故、プログ...
-
c++の勉強方法を教えてくださ...
-
パソコン
-
あんまり考えたくないけど
-
C++でデスクトップGUIアプリ開...
-
C言語について。
-
VisualStudioでC++クラスを追加...
-
C言語でファクト関数を使わずに...
-
Windows Formアプリからコンソ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DLLファイルの逆コンパイラにつ...
-
大量のデータを読み込んで表示...
-
c言語
-
gccを行ってもexeファイルが生...
-
visual studio 2022でのC#プロ...
-
【C言語】全角文字の配列を、全...
-
Windows Formアプリからコンソ...
-
VisualStudioでC++クラスを追加...
-
VisualStudio2022でC言語プログ...
-
プログラマー達は何故、プログ...
-
C++でデスクトップGUIアプリ開...
-
逆コンパイルと逆アセンブルの...
-
C言語について。
-
C#でTreeViewのCheckBoxのサイ...
-
C言語の関数のextern宣言
-
int16_t の _t は何?
-
C#でログファイルにファイルパ...
-
ディスプレイの解像度とマウス...
-
c言語でイベントフラグを使った...
-
C言語のことです。写真(見にく...
おすすめ情報