3-6. カプセル化

公開日: 23:52 3. オブジェクト指向編/3-6. カプセル化


C++プログラムは次の基本要素で構成されています。
  • プログラム構文(コード) アクションを実行するプログラムであり、関数と呼ばれます
  • プログラムデータ データは関数に影響を受けるプログラムの情報です。
カプセル化はデータとデータを操作する関数を結ぶオブジェクト指向プログラミングのコンセプトであり、それにより外部からの干渉や不正利用を防ぎます。

カプセル化はオブジェクト指向プログラミングの重要なコンセプトであるデータの隠蔽とつながっています。カプセル化はデータを束ねるメカニズムであり、それらを使う関数と抽象化はインタフェースのみを露出し、ユーザから実装の詳細を隠蔽するメカニズムです。

C++はクラスと呼ばれるユーザ定義型を通してカプセル化の特性やデータ隠蔽をサポートします。これまでクラスはprivate、protected、publicメンバを持てることを学びました。デフォルトでは、クラス内で定義されたすべての要素はprivateとなります。
class Box
{
   public:
      double getVolume(void)
      {
         return length * breadth * height;
      }
   private:
      double length;      // boxの縦幅
      double breadth;     // boxの横幅
      double height;      // boxの深さ
};

変数length、breadth、heightはprivateです。これはBoxクラスの他のメンバからのみアクセスされることを意味し、プログラムの他の場所からはアクセスされません。これはカプセル化が実現した一例です。

(クラスの外からアクセスできる)クラスのpublic部分を作るには、publicキーワードを使った後に宣言します。public指定子の後に定義された変数と関数はプログラム内の他の関数からアクセス可能となります。

他クラスのフレンドクラスを作ること実装の詳細をさらけ出しカプセル化を弱くします。極力多くのクラスの詳細を、他クラスから可能な限り隠すことが理想です。

カプセル化の例

C++プログラムではpublicとprivateメンバで定義したクラスはカプセル化と抽象化の例となります。次の例を考えてみましょう。
#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 << "合計 " << a.getTotal() <<endl;
   return 0;
}

上のコードをコンパイルし実行すると、次の結果が得られます。
合計 60

上述のクラスは数字を加算し、合計を返します。publicメンバaddNumとgetTotalは外部へのインタフェースでありクラスを利用するユーザはこれらを知っている必要があります。privateメンバtotalは外部から隠蔽されているものですが、クラスにとって正確に操作するために必要です。

戦略設計

プログラマの多くは苦い経験を通して、外部に見せる必要が無い限りクラスメンバはprivateをデフォルトにすると学んできました。これこそがカプセル化です。

この知恵はデータメンバに頻繁に当てはまりますが、仮想関数を含む全てのメンバにも当てはまります。
  • ?±??G???g???[?d????u?b?N?}?[?N???A

0 件のコメント :

コメントを投稿