ページ 1 / 1
三原則の一つ、カプセル化の利点
Posted: 2010年6月04日(金) 11:12
by im
こんにちは、オブジェクト指向三原則の一つ、カプセル化についてお聞きします。
たとえば、クラスを以下のように定義します。C++です。
class クラス名
{
private: // ~~非公開部分~~
データメンバ
・・・
public: //~~公開部分~~
メンバ関数
・・・
}
とすると、privateで宣言した変数はクラスのメンバ関数とフレンドでしか使用することはできなかったと思います。
よって、privateで宣言した変数におかしな値が入った場合、このクラスをじっくりみれば、その理由がわかり、結果としてバグが減る。
ということがカプセル化の利点の一つと解釈してよろしいでしょうか。
また、カプセル化がプログラムの信頼性の向上につながる例を示してほしいのですが、お願いできますか。できるだけ短く、わかりやすいものがいいです。
Re:三原則の一つ、カプセル化の利点
Posted: 2010年6月04日(金) 13:50
by たかぎ
> よって、privateで宣言した変数におかしな値が入った場合、このクラスをじっくりみれば、その理由がわかり、結果としてバグが減る。
というか、おかしな値が入ること自体が間違いでは?
おかしな値が入るような操作ができないようにするのが、利点の一つかと思います。
あとは、クラスの内部表現に依存せずにユーザーが利用できるように、抽象化できることも大きな利点です。
Re:三原則の一つ、カプセル化の利点
Posted: 2010年6月04日(金) 20:44
by ookami
> privateで宣言した変数におかしな値が入った場合、このクラスをじっくりみれば、その理由がわかり、結果としてバグが減る
これはカプセル化には関係ないと思いますよ。例えば、
private:
int x;
public:
void setX(int _x){x=_x;}
と、
public:
int x;
では、「変数におかしな値が入った場合、このクラスをじっくりみれば、その理由がわか」るかどうかに違いはないですよね。(もしかしてこれはカプセル化とは言わない?)
> カプセル化がプログラムの信頼性の向上につながる例
「カプセル化でなければ得られない信頼性」というのは無いんじゃないかなと。プログラムの信頼性は、結局どんなケースを想定してテストしたかに尽きると思います。
信頼性ではなくて利点、という意味では、たかぎさんのおっしゃる通りと思います。
Re:三原則の一つ、カプセル化の利点
Posted: 2010年6月04日(金) 20:59
by dic
カプセル化ということは外部からアクセスできなくすることですが
間違った値が入力されないよう以下のようにして実装できます
#include <iostream>
class A
{
private:
int m_x;
public:
void SetX( int x );
};
void A::SetX( int x )
{
if( x < 0 )
{
printf( "error セットする値がマイナスです\n" );
return;
}
if( x > 1000 )
{
printf( "error セットする値が想定より大きいです\n" );
return;
}
m_x = x;
printf( "%dをセットしました\n", m_x );
}
int main()
{
A a;
a.SetX( -999 );
a.SetX( 10000 );
a.SetX( 200 );
return 0;
}
公開されたメンバ関数 SetX のところに入力の値をチェックする機能を追加すれば
m_x 非公開なメンバ変数におかしな値が入ることを防げます