なぜこれがルールなのかわかりません。そして、このルールのどのような利点がありますか?
このルールに従うほうがよい例を教えてください。
4 に答える
これはデータ非表示とも呼ばれ、オブジェクトの整合性を維持するのに役立ちます。誤用や外部からの干渉からデータを保存します。データに直接アクセスすることはできませんが、情報を取得するためにアクセス制御を指定することはできます。データまたはオブジェクトは、必要に応じてパブリックまたはプライベートにすることができます。プライベートなデータは、オブジェクトのスコープ外ではアクセスできません。データが公開されている場合、プログラムの他の部分からアクセスできます。
「クラスのユーザーがそれを誤用するのを防ぐ」ことは、カプセル化が非常に重要である理由としてしばしば宣伝されます。
これは、信頼できない他の開発者が使用するクラスを作成していることを意味していると思いますが、これはめったにないことだと思います。信頼できないクライアントの議論は問題を混乱させます。
ほとんどの場合、クラスのユーザーは「あなた」とあなたのチームのメンバーです。
クラスのパブリックメソッドとプロパティは、クラスと残りのコードの間のインターフェイスポイントを構成します。そのインターフェースが小さいほど、使いやすく、理解しやすくなります。
カプセル化する理由は、クラスのインターフェースをできるだけ小さく簡潔にするためです。
クラスが非常にまとまりがあり、インターフェイスが小さい場合は、クラスがどのように機能するかを簡単に「忘れて」、プログラムの別の部分に集中できます。
Webリクエストを行うクラスの例を見てみましょう。単一のパブリックメソッドDownloadFile(url)を公開する場合があります。このクラスは非常に複雑になる可能性がありますが、インターフェイスがシンプルであるため、どのように機能するかを忘れて、解決しようとしている問題に集中する余地があります。
反例は、すべてのメソッドを公開するWebリクエストクラスです。DownloadBegin、DownloadEnd、ChooseProtocolなどの20のメソッドがあります。これらはすべて内部で使用できますが、外部で呼び出すことを意図したものではありません。クラスを使用するには、呼び出すメソッドを知る前に、クラスが内部でどのように機能するかを知る必要があります。
多くの人に宣伝されるデータ隠蔽の長所の1つは、クラスを誤用から保護するのに役立つことです。クラスのユーザーがそれを使って正しいことをすることを信頼することはできないので、あなたはそれを使って間違ったことをすることを不可能にします。ほとんどの場合、クラスのユーザーにそのメンバーのいずれかに直接アクセスできるようにすると、そのメンバーが無効または無意味な値に設定されたり、間違った時間に設定されたりする可能性があります。
より実用的な理由の1つは、データメンバーの実装を変更できないことです。たとえば、size
一般公開しているメンバーがいて、後でサイズの変更に応じてクラスに実際に何かをさせる必要がある場合は、行き詰まります。アクセサメソッドがある場合、これらのメソッドは必要なだけ魔法のようになります。
また、関心の分離にも関係しています。パブリックインターフェイスがあり、データがパブリックでない場合は、データを保持するクラスのみを変更して、データの表現方法をいつでも変更できます。データが非表示になっておらず、変更する場合は、データを使用するすべてのコードを変更する必要があります。