No.4ベストアンサー
- 回答日時:
変数を基準に考えてるのではオブジェクト指向になりません。
オブジェクトの中でどのような操作が行われているかは、外からすれば気にしないで良いように設計するべきです。オブジェクトが外に公開するのは、その操作(実装で言えばメンバ関数)です。どのような操作をそのオブジェクトは提供するか、という視点で考えてみてください。
例えば複素数クラスであれば、
・足し算可能
・掛け算可能
・コピー可能
・偏角・絶対値取得
・Re・Im取得
などを使えれば十分でしょう。このように、使用させる操作だけ公開しておけば、中の変数が(x,y)で管理されていたとしても(r,θ)で管理されていたとしても外から見れば関係ありません。
基本的には、内部の変数そのものは外からタッチさせないものです。
No.6
- 回答日時:
> 動的初期化というのは、必要に応じて初期化する行為を指すのでしょうか。
それとも動的変数の初期化を指すのでしょうか?どちらでもありません。
動的初期化というのは、非局所オブジェクト(関数の外で定義したオブジェクト。静的データメンバもこれにあたる)のうち、明示的なコンストラクタを持つものや、定数式以外の初期化子を持つものの初期化です。
例えば、
struct A
{
A();
};
A a; // 明示的なコンストラクタを持つので動的初期化
int b = func(); // 定数式以外の初期化子を持つので動的初期化
という具合です。
動的初期化が行われる順序は、同じ翻訳単位内では上から順番なのですが、翻訳単位をまたがった場合の順序は不定になります。
こういったものは静的データメンバにしない方が無難です。
No.5
- 回答日時:
非静的データメンバは、すべてprivateにするか、すべてpublicにするかのどちらかです。
すべてpublicにするのは集成体かそれと同等の用途の場合です(例えば、明示的なコンストラクタがあっても、用途が集成体と同じ場合など)。静的データメンバはケースバイケースですが、そもそも動的初期化が必要なものは静的データメンバにはしない方が無難ですね。
やや余談ですが、仮想関数は原則としてprivateにし、派生クラスから呼び出される可能性があるもの(それを前提とした設計にんっているもの)のみprotectedにします。つまり仮想関数はpublicにはしません(NVIイディオムまたはNVIパターンで検索してください)。
getterやsetterの類は必ずしも必要ではありません。クラスのメンバ関数はデータメンバを直接操作せざるを得ない最小限のものに限定し、非メンバ・非friendの関数にできるものは原則そのようにします。
何でもかんでもメンバ関数にしようとすると、getterやsetterを用意しないと厳しくなります(データメンバがグローバル変数に近くなるので)。
>静的データメンバはケースバイケースですが、そもそも動的初期化が必要なものは静的データメンバにはしない方が無難ですね。
動的初期化というのは、必要に応じて初期化する行為を指すのでしょうか。それとも動的変数の初期化を指すのでしょうか?
No.3
- 回答日時:
がると申します。
んと…きちんとした「オブジェクト指向プログラミング」をするのであれば。
・変数は全てprivate
・全ての変数にgetter、setterを作る。ただしそれがpublicなのかprotectedなのかはクラス次第
はほぼ鉄則だと思ってください。
ちなみに当然ではありますが「自分のclass内変数を触るときもgetter、setter経由」にしましょう。
後々の、保守メンテナンス性が根底から変わりますので。
アクセサ(getter、setter)を作成するのは。初めは非効率に思えるかも知れませんが、キャリアを積むと「作成しない方が非効率である」事がわかると思います。
この回答への補足
getter,setterでググると、参考になるサイトが見つかりました。
僕は個人の好きでやってるので、そうした保守などの必要性が低いですが、後々の変更に耐えうるクラスを設計する場合にはsetter,getterを取り入れようと思います。ありがとうございました。
No.1
- 回答日時:
変数は極力privateにすべきです。
Set()やGet()はprivateの意味がかなり薄れます。
publicよりはましかも知れませんが。
classの意味の大きな部分にカプセル化という概
念があります。publicはカプセル化を崩します。
設計のあり方でprivateにしますが、privateにす
ると、どうしても効率が悪くなる場合は、その時
点の設計力の限界と割り切ってpublicも致し方が
無いでしょう。基本方針は基本方針ですが、こだ
わり続けるのは非効率でしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- YouTube YouTubeの設定について詳しい方教えてください。 1 2022/10/08 06:32
- 法学 全部取得条項付株式の取得と引換えにする株式の発行 申請書について 1 2022/12/21 17:32
- Instagram ある人のインスタが公開アカウントだったので暇つぶしに見てました。その人とは相互フォローではないです。 2 2022/07/13 00:42
- Excel(エクセル) 【エクセルマクロ】既に開いているIEの、サイズや表示位置を変更するには 4 2022/12/01 22:57
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- 教えて!goo 先程、或る人のプロフィール見ました。 何故見る気になったのかと言うと その人とは質回はしてない筈です 3 2022/09/13 16:57
- その他(悩み相談・人生相談) 質問履歴、回答履歴を公開してる人って少ないですよね?読まれたくない、もしくは元々非公開だから設定を変 5 2022/11/23 07:17
- 物理学 ドップラー効果について 静止している波源から出た波(光速c)を遠ざかる観測者が観測した場合 「λは観 4 2022/05/06 15:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
vb.net オブジェクト指向につい...
-
Excelで =EMBED("Acrobat Docu...
-
error C2712: オブジェクト ア...
-
ビジュアルC++でボタンの有...
-
プリコンパイルされたSQL文を取...
-
多人数のじゃんけんプログラム
-
VBAのWindowオブジェクトとWork...
-
C#でフォームのオブジェクト名...
-
JSPのout.printについて
-
Listに格納されているオブジェ...
-
空の文字列とnullと""
-
ADO オブジェクトの渡し方
-
VBA 同じ名前のオブジェクトを...
-
VBからBATファイルを起動して戻...
-
ワイルドカード<?>と型パラメー...
-
COMコンポーネントって何?
-
戻り値がクラスオブジェクト
-
エプソンVP-930のESC/Pの操作に...
-
Date型オブジェクトから日付の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
ワイルドカード<?>と型パラメー...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBAのWindowオブジェクトとWork...
-
C#でフォームのオブジェクト名...
-
LISTBOXの内容が更新されま...
-
Object型からDouble型へのキャスト
-
JAVAからHTMLへ値を返す方法
-
COMコンポーネントって何?
-
ビジュアルC++でボタンの有...
-
戻り値がクラスオブジェクト
-
VBA 同じ名前のオブジェクトを...
-
ASP.net 教えてください!!(...
-
Vbで通常使用するプリンターを...
-
newは明示的にした方が良いのか?
-
CoCreateInstanceでエラーになる。
-
オブジェクトレベルとメタレベル
-
bmp画像をjpegやpng画像に圧縮...
-
Accessの連結・非連結オブジェ...
おすすめ情報