最近質問させていただきましたシャイニング生ごみと申します。
開発環境はVisualStudio2008 C++ DxLibrary使用です。
C++を学び始めて半年です。
今回質問したいのはアクセッサについてなのですが、そもそもアクセッサはどのようなときに使うのでしょうか。
例えば
このように使われているアクセッサならば、ガソリン量が負の値になることはないのでバグ回避のために有用だということはわかります。しかし、そのほかの場合ではアクセッサはなんの為に使うのでしょうか。クラス内だけで使う変数をわざわざget()とset()にする必要はないと思いますし、同クラス外でprivate内の値がset()で変更できてしまうのならそもそも変数をprivateにする必要も無い気がします。そこで皆さんにアクセッサの有用な使い方を教えてもらいたく質問をさせて頂きました。どうかよろしくお願いします。
アクセッサにいついて
-
シャイニング生ごみ
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: アクセッサにいついて
大半の理由はこちらで語られている事だと思います。
http://ja.wikipedia.org/wiki/%E3%83%A1% ... 6.E4.BA.89
http://ja.wikipedia.org/wiki/%E3%83%A1% ... 6.E4.BA.89
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
シャイニング生ごみ
Re: アクセッサにいついて
softya(ソフト屋)さん 適切な参考リンクを張って頂きありがとうございました。
とても参考になりました、ですがもし良ければ皆さんはどのようにしているか聞かせていただけないでしょうか。
特に聞きたいのは同クラス内でも必ずアクセサを通すべきかどうかということです。
この参考リンクに書いてあったように論争になってしまうようならば即座に止めますのでどうかご助力お願いします。
とても参考になりました、ですがもし良ければ皆さんはどのようにしているか聞かせていただけないでしょうか。
特に聞きたいのは同クラス内でも必ずアクセサを通すべきかどうかということです。
この参考リンクに書いてあったように論争になってしまうようならば即座に止めますのでどうかご助力お願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: アクセッサにいついて
私論で言えば、ただ変数に入れるだけのアクセッサはカプセル化の観点から内部構造を見せている事になります。
どうしても必要な場合を除き、アクセッサではないメンバ関数の呼び出し引数や演算子のオーバーロードで扱えないか検討して最低限で済ますほうが良いと思います。
クラス内アクセッサは、分かりやすく成るとか安全性が高まるとか意味があるならやるべきですが、積極的にはどうでしょうか?
あとマルチスレッドに対応させるときの同期の観点からバラバラに値がセットされるよりは、設定メンバ関数で一度に設定してもらうほうが都合が良いです。
どうしても必要な場合を除き、アクセッサではないメンバ関数の呼び出し引数や演算子のオーバーロードで扱えないか検討して最低限で済ますほうが良いと思います。
クラス内アクセッサは、分かりやすく成るとか安全性が高まるとか意味があるならやるべきですが、積極的にはどうでしょうか?
あとマルチスレッドに対応させるときの同期の観点からバラバラに値がセットされるよりは、設定メンバ関数で一度に設定してもらうほうが都合が良いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
tk-xleader
Re: アクセッサにいついて
インターフェイス(C++ではしばし全てのメンバが純粋仮想関数であるクラスで表現します。)にアクセッサを宣言しておき、実装するクラスでそのアクセッサを定義するとか…
「○○というメンバ変数を定義せよ」ということはインターフェイスでは定義できないんですよね。
「○○というメンバ変数を定義せよ」ということはインターフェイスでは定義できないんですよね。
Re: アクセッサにいついて
個人的には同クラス内のプライベート変数に一対一で対応するアクセッサを作ることはほとんどないですね。
アクセッサが必要になったらそれはクラスとして分ける段階だと考えます。
質問に書かれた例だとGasクラスを作る必要性を感じます。
単純にassertじゃなくてアクセッサで例外を投げるほうがC++的かもしれないという気はします。気がするだけですけど。
アクセッサが必要になったらそれはクラスとして分ける段階だと考えます。
質問に書かれた例だとGasクラスを作る必要性を感じます。
単純にassertじゃなくてアクセッサで例外を投げるほうがC++的かもしれないという気はします。気がするだけですけど。
-
シャイニング生ごみ
Re: アクセッサにいついて
皆様解答ありがとうございます。個人個人で使い方や考え方が違うのでとても興味深い意見でした。
インターフェイスで宣言する、というのはまだインターフェイスクラスを使っていないのでピンときませんでしたが、今後検討していきたいと思います。今回私が特に納得させられたのがただ変数を入れるだけのアクセッサはカプセル化を妨げてるというものでしたので、しばらくは同一クラス内ではアクセッサを使わずに必要なものだけにアクセッサを用意するということにしました。貴重なご意見をありがとうございました。 今回はこれで解決とさせて頂きますが、是非とも自分はこうしてるよ!等のアドバイスがございましたら書き込んで頂ければ幸いです。
それでは失礼しました。
インターフェイスで宣言する、というのはまだインターフェイスクラスを使っていないのでピンときませんでしたが、今後検討していきたいと思います。今回私が特に納得させられたのがただ変数を入れるだけのアクセッサはカプセル化を妨げてるというものでしたので、しばらくは同一クラス内ではアクセッサを使わずに必要なものだけにアクセッサを用意するということにしました。貴重なご意見をありがとうございました。 今回はこれで解決とさせて頂きますが、是非とも自分はこうしてるよ!等のアドバイスがございましたら書き込んで頂ければ幸いです。
それでは失礼しました。