[解決済み] C++におけるアクセッサメソッド(ゲッターとセッター)の規約
質問
C++のアクセッサメソッドに関するいくつかの質問がSOで出されていますが、この問題に対する私の好奇心を満たすものはありませんでした。
Stroustrupや他の有名なプログラマーのように、私は多くのアクセサを持つクラスは悪いOOの兆候であると考えているので、可能な限りアクセサを避けようとします。C++ では、ほとんどの場合、クラスにもっと責任を持たせるか、friend キーワードを使用してアクセス権を回避することができます。しかし、場合によっては、本当に特定のクラスのメンバーにアクセスする必要があります。
いくつかの可能性があります。
1. アクセッサを全く使わない
それぞれのメンバ変数をpublicにすればいいんです。これはJavaではダメですが、C++のコミュニティではOKのようです。ただ、オブジェクトの明示的なコピーや読み取り専用(const)の参照を返すべきケースはちょっと心配ですが、大げさでしょうか?
2. Java形式のget/setメソッドを使う
Javaからかどうかは全く分かりませんが、つまりはこういうことです。
int getAmount(); // Returns the amount
void setAmount(int amount); // Sets the amount
3. 客観的なC言語スタイルのget/setメソッドを使用する
これは少し奇妙ですが、どうやらますます一般的になってきているようです。
int amount(); // Returns the amount
void amount(int amount); // Sets the amount
これを動作させるには、メンバー変数に別の名前を付ける必要があります。アンダースコアを付ける人もいれば、"m_"を付ける人もいます。私はどちらも好きではありません。
どのようなスタイルを使っているのですか?
どのように解決するのですか?
400 万行の C++ コード (それも 1 つのプロジェクト) を抱えている私の視点から、メンテナンスの観点から言うと、次のようになります。
-
メンバーが不変であれば、ゲッター/セッターを使わなくても大丈夫です (例.
const
など)、あるいは依存関係のない単純なもの(メンバーXとYを持つ点クラスのようなもの)であれば、getter/setterを使わなくても大丈夫です。 -
もしメンバが
private
のみであれば、ゲッター/セッターを省略することもできます。また、内部の pimpl -というクラスはprivate
.cpp 単位が小さい場合。 -
もし、メンバーが
public
またはprotected
(protected
と同じようにpublic
と同じです)、非const
でない場合、単純でない場合、依存関係がある場合は、ゲッター/セッターを使用します。
保守担当者として、ゲッター/セッターを持ちたいと思う主な理由は、ブレークポイント/ロギング/その他のものを置く場所があるからです。
私は、より検索性が高いので、代替案2.のスタイルを好みます(保守可能なコードを書くための重要な要素です)。
関連
-
[解決済み】構造体のベクター初期化について
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み] Visual Studioでゲッターとセッターを生成するにはどうしたらいいですか?
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
-
[解決済み] ゲッターとセッターはどのように機能するのですか?
-
[解決済み] ECMAScript 6のクラスでゲッターとセッターは何のためにあるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません