あなたは理論を知っていると言い、他の答えはパブリック/プライベート、ゲッター、セッターの意味を掘り下げたので、パブリック属性(C ++のメンバーデータ)を作成する代わりにアクセサーを使用する理由に焦点を当てたいと思います。 .
ロジスティック プロジェクトにクラス Truck があるとします。
class Truck {
public:
double capacity;
// lots of more things...
};
あなたが北米人であれば、トラックの容量を表すためにガロンを使用するでしょう。プロジェクトが完成したと想像してください。多くの直接的な使用Truck::capacity
が行われていますが、完全に機能します。実際、あなたのプロジェクトは成功したので、あるヨーロッパの会社はあなたのプロジェクトを彼らに適応させるようにあなたに依頼しました。残念ながら、プロジェクトでは現在メートル法を使用する必要があるため、容量にはガロンではなくリットルを使用する必要があります。
さて、これは混乱する可能性があります。もちろん、北米だけのコードベースと、ヨーロッパだけのコードベースを用意することも 1 つの可能性です。しかし、これはバグ修正を 2 つの異なるコード ソースに適用する必要があり、それは実行不可能であると判断されたことを意味します。
解決策は、プロジェクトで構成の可能性を作成することです。ユーザーは、固定された固定のガロンの選択ではなく、ガロンまたはリットルを設定できる必要があります。
上記のアプローチでは、これは多くの作業を意味し、 のすべての使用法を追跡しTruck::capacity
、それらをどうするかを決定する必要があります。これはおそらく、コードベース全体に沿ってファイルを変更することを意味します。theoretic
別の方法として、より多くのアプローチを決定したとしましょう。
class Truck {
public:
double getCapacity() const
{ return capacity; }
// lots of more things...
private:
double capacity;
};
可能性のある別の変更には、クラスのインターフェースへの変更は含まれません。
class Truck {
public:
double getCapacity() const
{ if ( Configuration::Measure == Gallons ) {
return capacity;
} else {
return ( capacity * 3.78 );
}
}
// lots of more things...
private:
double capacity;
};
(これを行うには多くの方法があること、その方法は 1 つの可能性にすぎないこと、およびこれは単なる例であることを考慮してください)
グローバル ユーティリティ クラス構成を作成する必要がありますが (ただし、とにかくそれを行う必要がありました)、truck.h
forconfiguration.h
に include を追加する必要がありますが、これらはすべてローカルな変更であり、残りのコードベースは変更されないため、潜在的なバグを回避できます。
最後に、あなたは現在、大きなプロジェクトに取り組んでいると述べていますが、それは、これらの理由が実際により理にかなっているような分野だと思います. 大規模なプロジェクトで作業する際に念頭に置いておくべき目的は、保守可能なコード (つまり、新しい機能で修正および拡張できるコード) を作成することです。個人的な小さなプロジェクトではゲッターとセッターのことは忘れてもかまいませんが、私はそれらに慣れるように努めます。
お役に立てれば。