1. ホーム
  2. c++

[解決済み] パブリックデータメンバーとゲッター、セッター

2023-07-24 11:57:43

質問

私は現在、QtとC++で作業しています。私はプライベートデータメンバーとパブリックメンバー関数を持っているクラスを持っています。私はクラスで利用可能なデータメンバのためのパブリックゲッターとセッターを持っています。

今、私の質問は、私たちのクラスでデータメンバのゲッターとセッターがある場合、これらのデータメンバをプライベートとして作ることに何の意味があるのでしょうか? Baseクラスでプライベートなデータメンバを持つことは論理的に聞こえることに同意します。しかし、それ以外に、プライベートメンバーを持っていて、そのゲッターとセッターを行うことは、私にとって論理的なものであるとは思えません。

あるいは、代わりに はすべての変数をパブリックにして、ゲッターとセッターを全く必要としないようにすることができますか?それを持つことは良い習慣ですか? プライベートメンバがデータの抽象化を保証することは知っていますが、ゲッターとセッターを持つことは、実際にはそれらの変数に非常に簡単にアクセスすることを可能にします。これに関するどんなポインタでも歓迎します。

どのように解決するのですか?

どちらでもありません。あなたは物事を行うメソッドを持つべきです。もしそのうちの1つが特定の内部変数に対応するのであれば、それは素晴らしいことですが、クラスのユーザーにそれを知らせるものは何もないはずです。

プライベートなデータはプライベートなので、好きなときに実装を置き換えることができます(完全なリビルドも可能ですが、それは別の問題です)。いったん精霊を瓶から出してしまうと、それを押し戻すことは不可能であることに気づくでしょう。

編集: 別の回答に対して行ったコメントの続きです。

私がここで言いたいのは、あなたは間違った質問をしているということです。ゲッター/セッターの使用やパブリック メンバーを持つことに関して、ベスト プラクティスは存在しません。あるのは、あなたの特定のオブジェクトと、それがどのように特定の現実世界のもの(またはゲームの場合はおそらく想像上のもの)をモデル化するかについて、何がベストであるかということだけです。

個人的には、ゲッター/セッターは2つの悪のうちでより少ないものです。なぜなら、いったんゲッター/セッターを作り始めると、人々は、どのデータが見えるべきで、どのデータが見えないべきかという批判的な目でオブジェクトを設計するのをやめてしまうからです。パブリックメンバーでは、すべてをパブリックにする傾向があるので、さらに悪いことです。

その代わりに、オブジェクトが何をするのか、そして何かがそのオブジェクトであることが何を意味するのかを検討します。そして、そのオブジェクトへの自然なインタフェースを提供するメソッドを作成します。その自然なインターフェイスは、ゲッターとセッターを使用していくつかの内部プロパティを公開することを含むので、それはそれでよいでしょう。しかし、重要な部分は、あなたが前もってそれについて考え、設計上正当な理由のためにゲッター/セッターを作成したことです。