ホーム » スタッフ » 斉藤徹 » 抽象化と隠蔽化

2007年4月
« 3月   5月 »
1234567
891011121314
15161718192021
22232425262728
2930  

最近の投稿(電子情報)

アーカイブ

カテゴリー

抽象化と隠蔽化

C 言語での構造体の使い方の範疇で、オブジェクト指向の導入。

struct Person {
char name[20] ;
int  kokugo ;
int  sansu ;
} ;
void input( struct Person*p ) {  // 後で別途アロー演算子を説明している。
scanf( "%s %d %d" , (*p).name , &((*p).kokugo) , &((*p).sansu) ) ;
}
void print( struct Person*p ) {
printf( "%s %d %d" , (*p).name , (*p).kokugo , (*p).sansu ) ;
}
void main() {
struct Person saitoh ;
struct Person array[ 5 ] ;
input( &saitoh ) ;
print( &saitoh ) ;
for( int i = 0 ; i < 5 ; i++ ) {
input( &(array[ i ]) ) ;
print( &(array[ i ]) ) ;
}
}

これにより、もしデータの変更があっても、main 内部は変更が不要となる。 このようなスタイルで、データに処理を適用するようなプログラムであれば、 データ設計者とデータ利用者で明確に分担作業の元でプログラム開発ができるようになる。

このようなスタイルでは、データに対して処理を呼び出すイメージとなる。 これを「抽象化」とよぶ。 このように、 データ構造を「オブジェクト」、 オブジェクトに対する処理を「メソッド」、 具体的なオブジェクトを「インスタンス」と呼ぶ。

このプログラムを C++ に変更

class Person {
private:
char name[ 20 ] ;
int  kokugo ;
int  sansu ;
public:
void input() { scanf( "%s %d %d" , name , &kokugo , &sansu ) ; }
void print() { printf( "%s %d %d" , name , kokugo , sansu ) ; }
} ;
void main() {
Person saitoh ;
Person array[ 5 ] ;
saitoh.input() ;
saitoh.print() ;
for( int i = 0 ; i < 5 ; i++ ) {
array[ i ].input() ;
array[ i ].print() ;
}
}

このようにインスタンスにメソッドを適用することを C++ では簡単に書ける。