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;
}
    malloc。
                    良い、無料、オンラインブック、というタイトルがあるANSI-Cでオブジェクト指向プログラミング C. Aにオブジェクト指向のコードを書くのトピックをカバーし、検索グーグル、「オブジェクト指向C」のためにも、他の財の数を生成するには、例とリソース。
プロジェクトが安全性を重視する場合は、MISRA-Cが適切なルールセットです。これは主に組み込みcを対象としていますが、他の領域でも役立つ場合があります。
私はオブジェクト指向のコーダーであり、組み込みCで多くの作業を行っています。特に大規模なプロジェクトの場合、私ができる最善のアドバイスは、やりすぎないことです。ANSI Cの上に完全なOOフレームワークを作成することは非常に魅力的ですが、それを正しく行うにはかなりの時間と労力が必要です。手の込んだほうが、実際のプロジェクトに取り組む代わりにフレームワークのデバッグに費やす時間が増えます。明確な頭とYAGNIをしっかりと把握して、作業に取り組みます。がんばって!
{ }ブロックの上部)で宣言する必要があることを忘れないでください。その一つは、常に一度か二度私を噛む:)
                    OOPは技術ではなく方法論です。だから私の最初のアドバイスは、それを手続き型プログラミングと考えるのをやめることです。
e.Jamesの要点として、オブジェクト指向言語を再作成したり、その機能を持っているように見せたりしたくはありません。いくつかの単純な原則に固執することで、すべての正しいことを行うことができます。