三原則の一つ、カプセル化の利点

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
im

三原則の一つ、カプセル化の利点

#1

投稿記事 by im » 15年前

こんにちは、オブジェクト指向三原則の一つ、カプセル化についてお聞きします。

たとえば、クラスを以下のように定義します。C++です。
class クラス名
{
private:        // ~~非公開部分~~

    データメンバ
    ・・・
        
public:         //~~公開部分~~
    
    メンバ関数    
    ・・・
}
とすると、privateで宣言した変数はクラスのメンバ関数とフレンドでしか使用することはできなかったと思います。
よって、privateで宣言した変数におかしな値が入った場合、このクラスをじっくりみれば、その理由がわかり、結果としてバグが減る。

ということがカプセル化の利点の一つと解釈してよろしいでしょうか。

また、カプセル化がプログラムの信頼性の向上につながる例を示してほしいのですが、お願いできますか。できるだけ短く、わかりやすいものがいいです。

たかぎ

Re:三原則の一つ、カプセル化の利点

#2

投稿記事 by たかぎ » 15年前

> よって、privateで宣言した変数におかしな値が入った場合、このクラスをじっくりみれば、その理由がわかり、結果としてバグが減る。

というか、おかしな値が入ること自体が間違いでは?
おかしな値が入るような操作ができないようにするのが、利点の一つかと思います。

あとは、クラスの内部表現に依存せずにユーザーが利用できるように、抽象化できることも大きな利点です。

ookami

Re:三原則の一つ、カプセル化の利点

#3

投稿記事 by ookami » 15年前

> privateで宣言した変数におかしな値が入った場合、このクラスをじっくりみれば、その理由がわかり、結果としてバグが減る

これはカプセル化には関係ないと思いますよ。例えば、
private:
int x;
public:
void setX(int _x){x=_x;}
と、
public:
int x;
では、「変数におかしな値が入った場合、このクラスをじっくりみれば、その理由がわか」るかどうかに違いはないですよね。(もしかしてこれはカプセル化とは言わない?)

> カプセル化がプログラムの信頼性の向上につながる例

「カプセル化でなければ得られない信頼性」というのは無いんじゃないかなと。プログラムの信頼性は、結局どんなケースを想定してテストしたかに尽きると思います。

信頼性ではなくて利点、という意味では、たかぎさんのおっしゃる通りと思います。

dic

Re:三原則の一つ、カプセル化の利点

#4

投稿記事 by dic » 15年前

カプセル化ということは外部からアクセスできなくすることですが
間違った値が入力されないよう以下のようにして実装できます
#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 非公開なメンバ変数におかしな値が入ることを防げます

閉鎖

“C言語何でも質問掲示板” へ戻る