Cplusplus-cpp-data-abstraction
C ++のデータ抽象化
データの抽象化とは、重要な情報のみを外部に提供し、その背景の詳細を隠すこと、つまり、詳細を提示せずにプログラムで必要な情報を表すことです。
データ抽象化は、インターフェイスと実装の分離に依存するプログラミング(および設計)手法です。
テレビの実際の例を1つ見てみましょう。テレビのオン/オフ、チャンネルの変更、音量の調整、スピーカー、VCR、DVDプレーヤーなどの外部コンポーネントの追加が可能ですが、内部の詳細はわかりません。つまり、空中またはケーブル経由で信号を受信する方法、信号を変換し、最終的に画面に表示する方法がわかりません。
したがって、テレビは内部実装を外部インターフェイスから明確に分離していると言えます。電源ボタン、チャンネルチェンジャー、ボリュームコントロールなどのインターフェイスは、内部の知識がなくても再生できます。
C ++では、クラスは優れたレベルの*データ抽象化*を提供します。 これらは、オブジェクトの機能を操作したり、オブジェクトデータ(つまり、クラスが内部的にどのように実装されているかを実際に知らない状態)を操作するのに十分なパブリックメソッドを外部に提供します。
たとえば、プログラムは、関数が実際に使用して特定の値をソートするアルゴリズムを知らなくても、* sort()*関数を呼び出すことができます。 実際、ソート機能の基礎となる実装はライブラリのリリース間で変更される可能性があり、インターフェースが同じである限り、関数呼び出しは引き続き機能します。
C ++では、 classes を使用して独自の抽象データ型(ADT)を定義します。 クラス ostream の cout オブジェクトを使用して、次のようにデータを標準出力にストリーミングできます-
#include <iostream>
using namespace std;
int main() {
cout << "Hello C++" <<endl;
return 0;
}
ここでは、 cout がユーザーの画面にテキストを表示する方法を理解する必要はありません。 パブリックインターフェイスのみを知っていればよく、「cout」の基礎となる実装は自由に変更できます。
アクセスラベルが抽象化を強制する
C ++では、アクセスラベルを使用して、クラスへの抽象インターフェイスを定義します。 クラスには、0個以上のアクセスラベルを含めることができます-
- 公開ラベルで定義されたメンバーは、プログラムのすべての部分からアクセスできます。 型のデータ抽象化ビューは、そのパブリックメンバーによって定義されます。
- プライベートラベルで定義されたメンバーは、クラスを使用するコードからアクセスできません。 プライベートセクションは、そのタイプを使用するコードから実装を隠します。
アクセスラベルが表示される頻度に制限はありません。 各アクセスラベルは、後続のメンバー定義のアクセスレベルを指定します。 指定されたアクセスレベルは、次のアクセスラベルが検出されるか、クラス本体の右中括弧が表示されるまで有効です。
データ抽象化の利点
データの抽象化には2つの重要な利点があります-
- クラス内部は、オブジェクトの状態を破壊する可能性のある不注意なユーザーレベルのエラーから保護されています。
- クラスの実装は、ユーザーレベルのコードを変更することなく、要件の変更やバグレポートに応じて時間とともに進化する場合があります。
クラスのprivateセクションでのみデータメンバーを定義することにより、クラスの作成者はデータを自由に変更できます。 実装が変更された場合は、クラスコードのみを調べて、変更の影響を確認する必要があります。 データが公開されている場合、古い表現のデータメンバーに直接アクセスする関数は破損する可能性があります。
データ抽象化の例
パブリックメンバーとプライベートメンバーを持つクラスを実装するC ++プログラムは、データ抽象化の例です。 次の例を考慮してください-
#include <iostream>
using namespace std;
class Adder {
public:
//constructor
Adder(int i = 0) {
total = i;
}
//interface to outside world
void addNum(int number) {
total += number;
}
//interface to outside world
int getTotal() {
return total;
};
private:
//hidden data from outside world
int total;
};
int main() {
Adder a;
a.addNum(10);
a.addNum(20);
a.addNum(30);
cout << "Total " << a.getTotal() <<endl;
return 0;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
Total 60
上記のクラスは数値を加算し、合計を返します。 パブリックメンバー- addNum および getTotal は外界へのインターフェースであり、ユーザーはクラスを使用するためにそれらを知る必要があります。 プライベートメンバー total は、ユーザーが知る必要はありませんが、クラスが適切に動作するために必要です。
戦略の設計
抽象化は、コードをインターフェースと実装に分離します。 したがって、コンポーネントの設計中は、基礎となる実装を変更してもインターフェースが損なわれないように、インターフェースを実装に依存しないようにする必要があります。
この場合、これらのインターフェースを使用しているプログラムが何であれ、それらは影響を受けず、最新の実装で再コンパイルする必要があります。