抽象化と隠蔽化
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++ では簡単に書ける。
Options +ほげ
緊急連絡システムの動作確認環境を触ろうとしたら、test環境だけが動かない。 一般利用者向けのサービスは、問題無く動いている。何が違うのか、悩んだけど、 ".htaccess"ファイルの "Options +ほげ" と "Options ほげ"の違い。 ぼーっとしていると、違いに気づくのに手間取る….
Options +ほげ httpd.confなどで許可されているOptionに追加する。 Options ほげ 事前のオプションを一旦無効にしたあとで、指定オプションを指定。