デザインパターン——C言語のオブジェクト向け


大学の第1のコンピュータの課程の中で、みんなはすべて過程に向かうことと対象に向かう概念を知っていて、更にイメージして、更に流行する言い方は:Cは過程に向かうのです;C++はCより高級で、オブジェクト向けです.しかし、多くの人の心の中では、C++言語を身につけることで、対象に向かう方法を身につけたのかという疑問があります.また何人がC++でC言語スタイルのコードを書いたのですか?だから、私はプログラミング言語ではなく、オブジェクト向けが思想、方法だと思っています.確かに、C++、javaのような言語は、オブジェクト向けのプログラミングでより余裕を発揮することができます.多くの言語特性がオブジェクト向けの思想をよりよく支えることができるからです.しかし、Cではオブジェクト向けのコードが書けないという意味ではなく、linuxカーネル(C言語実装)ではオブジェクト向けの考え方が多く、特にファイルシステムでは1つのVFSがそれを夢中になって遊ぶ.オブジェクト向けでは、パッケージ、継承、マルチステートの3つの重要な属性がある.C言語でこの3つの属性を実現できれば、オブジェクト向けにもなるのではないか.答えは肯定的で、ネット上では多くの先輩が解析しているCでC++の言語の特性をまねて、どのようにC++の風格のコードを書きます.しかし私はやはり:対象に向かうのは1種の思想で、すべての言語はすべてその自分の言語の特性があって、その自身の特性を利用して対象に向かうコードを書くことができて、本当の理解は対象に向かう思想です.ここでは,オブジェクト向けの3つの重要な属性をC言語でどのように表すかを簡単に列挙し,C言語での設計パターンを後述する.
1、パッケージ
struct _ObjectStruct;

typedef void (*handle)(struct _ObjectStruct* _data); 

typedef struct _ObjectStruct
{
    int data; //    
    handle handle_data; //    ,    
}ObjectStruct;

これにより、属性、動作は1つの構造体にカプセル化され、動作handleでは、そのパラメータが構造体ポインタであり、このポインタによって構造体の属性を取得することができる.これで完璧に統一された.
2、継承
typedef void (*process)(struct _ConcreteStruct* _data) ;

typedef struct _ConcreteStruct
{
    ObjectStruct object;
    int concreteData;
    process process_data;
}ConcreteStruct;

親をサブクラスの先頭にグループ化して配置すると、親のすべての属性と動作が継承されます.
3.マルチステート
ConcreteStruct* concrete = (ConcreteStruct*)malloc(sizeof(ConcreteStruct));
process_data = process_data_A;
//process_data = process_data_B;
concrete->process_data(concrete);

インタフェースの様々な異なる実装方式は、マルチステートである.関数ポインタの遅いバインドによって実現されます.オブジェクトconcreteを操作する場合、その動作の具体的な実装方法に関心を持つ必要はありません.concrete->process_を呼び出すだけです.data(concrete); で、process_Dataには、さまざまな実装方法があります.
この3つの属性では、C++、java言語がより完璧にサポートされていることは否めません.しかし、コードの中でオブジェクトの趣があちこちに現れるのが一番すごいです.次に、デザインモデルを利用してC言語のオブジェクト向けの思想を体現します.