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