C プロジェクトの設計時に従うことができる既知の設計原則、ベスト プラクティス、および設計パターンはありますか? または、手続き型 (命令型) プログラミング全般に役立つ設計原則はありますか?
(私は「オブジェクト指向世代」の子供で、初めて大規模な C プロジェクトを設計する必要があります)
C プロジェクトの設計時に従うことができる既知の設計原則、ベスト プラクティス、および設計パターンはありますか? または、手続き型 (命令型) プログラミング全般に役立つ設計原則はありますか?
(私は「オブジェクト指向世代」の子供で、初めて大規模な C プロジェクトを設計する必要があります)
情報隠蔽-Parnas(Software Fundamentals)によって支持されています。
ヘッダーと可視性の注意深い管理:
ヘッダーは自己保護されているため、複数回含まれているかどうかは関係ありません。
#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED
...rest of header contents, including other #include lines if necessary
#endif /* HEADER_H_INCLUDED */
'オブジェクト'(通常は構造体)で機能する関数のセットを設計し、それを使用しているコードで構造体の内部を突くのではなく、それらの関数を使用します。それを自主的なカプセル化と考えてください。
私の 3 つのアドバイス:
次に例を示します。
typedef struct Vector {
int size;
int limit;
int* ints;
} Vector;
Vector* Vector_new() {
Vector* res = (Vector*) malloc(sizeof(Vector));
res->limit = 10;
res->size = 0;
res->ints = (int*) malloc(sizeof(int) * res.limit);
return res;
}
void Vector_destroy(Vector* v) {
free(v->ints);
free(v);
}
void Vector_add(Vector* v, int n) {
if(v->size == v->limit) {
v->limit = v->limit * 2 + 10;
v->ints = realloc(v->ints, v->limit);
}
v->ints[v->size] = n;
++v->size;
}
int Vector_get(Vector* v, int index) {
if(index >= 0 && index < v->size)
return v->ints[index];
assert false;
}
Cでオブジェクト指向コードを書くというトピックをカバーする、ANSI-Cを使用したオブジェクト指向プログラミングというタイトルの優れた無料のオンラインブックがあります。 「オブジェクト指向C」をグーグル検索すると、他にも多くの優れたものが得られます。例とリソース。
プロジェクトがセーフティクリティカルである場合、MISRA-Cは優れたルールセットです。これは主に組み込みcを対象としていますが、他の領域でも役立つ場合があります。
私は自分自身をOOコーダーだと考えており、embedded-Cで多くの作業を行っています。特に大規模なプロジェクトの場合、私ができる最善のアドバイスは、やりすぎないことです。ANSI C上に完全なOOフレームワークを作成することは非常に魅力的ですが、それを正しく行うには多大な時間と労力がかかります。手の込んだものが多いほど、実際のプロジェクトで作業する代わりに、フレームワークのデバッグに多くの時間を費やすことになります。頭をすっきりさせ、 YAGNIをしっかりと把握して課題に取り組みます。頑張ってください!
OOP は技術ではなく方法論です。したがって、私の最初のアドバイスは、それを手続き型プログラミングと考えるのをやめることです。
e.James の指摘によれば、オブジェクト指向言語を再作成しようとしたり、その機能を持っているふりをしたりしたくはありません。いくつかの単純な原則に固執することで、すべての正しいことを行うことができます。