C ++でのデータ抽象化

データの抽象化とは、重要な情報のみを外の世界に提供し、その背景の詳細​​を隠すこと、つまり、詳細を提示せずにプログラムで必要な情報を表すことを指します。

データの抽象化は、インターフェイスと実装の分離に依存するプログラミング(および設計)手法です。

オンとオフを切り替えたり、チャンネルを変更したり、音量を調整したり、スピーカー、VCR、DVDプレーヤーなどの外部コンポーネントを追加したりできる、テレビの実際の例を1つ取り上げましょう。ただし、内部の詳細はわかりません。つまり、無線またはケーブルを介して信号を受信する方法、信号を変換する方法、そして最終的に画面に表示する方法がわかりません。

したがって、テレビは内部実装を外部インターフェイスから明確に分離しており、内部の知識がなくても、電源ボタン、チャンネルチェンジャー、音量調節などのインターフェイスで遊ぶことができます。

C ++では、クラスは優れたレベルの data abstraction。これらは、オブジェクトの機能を操作したり、オブジェクトデータ、つまりクラスが内部でどのように実装されているかを実際に知らなくても状態を操作したりするのに十分なパブリックメソッドを外部に提供します。

たとえば、プログラムはに電話をかけることができます sort()関数が指定された値をソートするために実際に使用するアルゴリズムを知らなくても関数。実際、並べ替え機能の基本的な実装は、ライブラリのリリース間で変更される可能性があり、インターフェイスが同じである限り、関数呼び出しは引き続き機能します。

C ++では、 classes独自の抽象データ型(ADT)を定義します。あなたは使用することができますcout クラスのオブジェクト ostream このようにデータを標準出力にストリーミングするには−

#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:
      // 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 これは、ユーザーが知る必要はありませんが、クラスが正しく動作するために必要なものです。

設計戦略

抽象化は、コードをインターフェースと実装に分離します。したがって、コンポーネントを設計するときは、インターフェースを実装から独立させて、基礎となる実装を変更してもインターフェースが損なわれないようにする必要があります。

この場合、これらのインターフェイスを使用しているプログラムが何であれ、影響を受けることはなく、最新の実装で再コンパイルする必要があります。