1. ホーム
  2. c++

[解決済み] C++におけるアクセッサメソッド(ゲッターとセッター)の規約

2023-06-15 02:12:27

質問

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.のスタイルを好みます(保守可能なコードを書くための重要な要素です)。