web-dev-qa-db-ja.com

変数をパブリックにすべきではないのに、パブリックゲッター/セッターを使用すべきなのはなぜですか?

私はC++チュートリアルビデオを見ています。それはクラス内の変数について話し、変数はプライベートとしてマークされるべきであると主張します。それを公に利用したいのなら、関数を介して間接的にやるべきだと説明しています。

どうして?違いは何ですか?結果は同じように見えますが、1行のコードを使用する代わりに、同じことを行うためにLOCが9または10増えています。

単純な方法で直接公開するのではなく、クラスのプライベート変数をクラス内のパブリックに変換することが、なぜ異なってより効率的であるのか、誰かが説明できますか?

8

変数を単に公開するのではなく、セッターとアクセサーを使用する理由はいくつかあります。

1。関心事の分離-クラスのコンシューマーは、アクセスしているものがプリミティブ変数なのか、それとももっと複雑なものなのかを知る必要も、気にする必要もありません。たとえば、車のクラスがあり、その車には馬力があるとします。 getHorsepower()メソッドを呼び出すことで馬力を取得でき、setHorsepower(int power)で設定できます。

さて、このクラスのコンシューマーは、内部で何が起こっているのかを気にしません。馬力メソッドがあるだけです。しかし、バックエンドで馬力を設定することがエンジンの変更を意味する場合はどうなりますか? setHorsepowerを呼び出すと、それを提供できるエンジンが見つかり、プライベートメソッドsetEngine(Engine newEngine)を呼び出して、車の動作が一貫していることを確認します。

2。コードの保守性-クラスを設定する場合、パブリック変数のみを使用することは理にかなっていますが、変数に対してエラーチェックを行う必要があるか、またはその変数を変更すると、別のオブジェクトが更新されます。パブリック変数を指定した場合は、それを使用するすべてのクラスを変更してから、A)エラーチェックのように必要なすべての機能を実装するか、B)アクセサーを使用するように変更する必要があります。それらにアクセサーを使用させることにより、その変数を使用するすべての場所を追跡する必要がなく、それらすべてを1つの場所で変更できます。

11
Ampt

ゲッターとセッターもデザインが貧弱です。それらはクラスが不変条件を強制することを可能にするので、パブリック変数より優れています。 Amptの例を借りるには、setHorsepowerはpublic馬力変数よりも優れています。これは、車のクラスが、setterで馬力が負になることはないが、public変数については何も保証できないためです。それが何もないよりはましですが、より優れたデザインは、自分の馬力を担当する車のインスタンスを持つことになります。車の内部状態をいじくりまわしているコードは、車のクラスとは別にする必要があります。それは不思議に思って、どこかで失われるべきではありませんでした。

5
stonemetal