データの抽象化とは、重要な情報のみが外部に提供され、背景の実装の詳細が非表示になること、つまり、必要な情報のみが詳細なしで表示されることを意味します。
データの抽象化は、インターフェイスと実装の分離に依存するプログラミング(設計)手法です。
C / C ++ラーニングスカート[7、12、2、84、705]、初心者でも上級者でも、転職したいのか、キャリアを始めたいのか、一緒に理解して学ぶことができます!スカートには開発ツールがあり、乾物や技術情報をたくさん共有できます!
テレビなどの実際の例を挙げましょう。オンとオフを切り替えたり、チャンネルを切り替えたり、音量を調整したり、外部コンポーネント(スピーカー、ビデオレコーダー、DVDプレーヤーなど)を追加したりできますが、わかりません。その内部実装の詳細、つまり、ケーブルを介して信号を受信する方法、信号を変換する方法、そして最終的に画面に表示する方法がわかりません。
したがって、テレビは内部実装を外部インターフェースから分離していると言えます。内部実装の原則を知る必要はなく、外部インターフェース(電源ボタン、リモコン、サウンドなど)を介してテレビを直接制御できます。ボリュームコントローラー)。
それでは、ビジネスに取り掛かりましょう。C++プログラミングに関する限り、C ++クラスはデータ抽象化の可能性を提供します。これらは、オブジェクトデータを操作するための多数のパブリックメソッドを外界に提供します。つまり、外界は実際にはクラスの内部実装を認識していません。
たとえば、プログラムは、関数内のデータの並べ替えに使用されるアルゴリズムを知らなくても、sort()関数を呼び出すことができます。実際、関数の並べ替えの基本的な実装は、ライブラリのバージョンによって異なります。インターフェイスが変更されていない限り、関数呼び出しは通常どおり機能します。
C ++では、クラスを使用して独自の抽象データ型(ADT)を定義します。以下に示すように、iostreamのようなcoutオブジェクトを使用して、データを標準出力に出力できます。
#include <iostream>
using namespace std;
int main( )
{
cout << "Hello C++" <<endl;
return 0;
}
ここでは、coutがユーザーの画面にテキストを表示する方法を理解する必要はありません。パブリックインターフェイスを知っているだけで、coutの基本的な実装は自由に変更できます。
アクセスタグの必須の抽象化
C ++では、アクセスタグを使用して、クラスの抽象インターフェイスを定義します。クラスには、0個以上のアクセスタグを含めることができます。
- パブリックタグで定義されたメンバーは、プログラムのすべての部分にアクセスできます。データのタイプの抽象的なビューは、そのパブリックメンバーによって定義されます。
- プライベートタグで定義されたメンバーは、クラスを使用してコードにアクセスできません。プライベート部分は、型を使用してコードから実装の詳細を隠します。
アクセスタグの頻度に制限はありません。各アクセスラベルは、その直後のメンバーによって定義されたアクセスレベルを指定します。指定されたアクセスレベルは、次のアクセスタグが検出されるか、クラス本体の閉じ括弧が検出されるまで有効です。
データ抽象化の利点
データの抽象化には2つの重要な利点があります。
- クラスの内部は、意図しないユーザーレベルのエラーによるオブジェクトの状態への損傷から保護されています。
- クラスの実装は、要件の変化に対応するため、またはユーザーレベルのコードを変更する必要のないバグレポートに対応するために、時間の経過とともに変化する可能性があります。
データメンバーがクラスのプライベート部分でのみ定義されている場合、クラスを作成した作成者はデータを自由に変更できます。実装が変更された場合は、クラスのコードをチェックするだけで、この変更がどのような影響を与えるかを確認できます。データが公開されている場合、古い表現のデータメンバーに直接アクセスする関数が影響を受ける可能性があります。
データ抽象化の例
C ++プログラムでは、パブリックメンバーとプライベートメンバーを持つ任意のクラスをデータ抽象化のインスタンスとして使用できます。次の例を考えてみましょう。
#include <iostream>
using namespace std;
class Adder{
public:
// 构造函数
Adder(int i = 0)
{
total = i;
}
// 对外的接口
void addNum(int number)
{
total += number;
}
// 对外的接口
int getTotal()
{
return total;
};
private:
// 对外隐藏的数据
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は外部インターフェースであり、ユーザーはクラスを使用するためにそれらを知る必要があります。プライベートメンバーの合計は、ユーザーが知る必要のないものですが、クラスが適切に機能するために必要です。
設計戦略
抽象化は、コードをインターフェースと実装に分離します。したがって、コンポーネントを設計するときは、インターフェースを実装から独立させておく必要があります。これにより、基礎となる実装を変更しても、インターフェースは同じままになります。
この場合、どのプログラムがインターフェースを使用しても、インターフェースは影響を受けず、最新の実装を再コンパイルするだけです。