95

C プロジェクトの設計時に従うことができる既知の設計原則、ベスト プラクティス、および設計パターンはありますか? または、手続き型 (命令型) プログラミング全般に役立つ設計原則はありますか?

(私は「オブジェクト指向世代」の子供で、初めて大規模な C プロジェクトを設計する必要があります)

4

4 に答える 4

67

情報隠蔽-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 */
    
  • 'オブジェクト'(通常は構造体)で機能する関数のセットを設計し、それを使用しているコードで構造体の内部を突くのではなく、それらの関数を使用します。それを自主的なカプセル化と考えてください。

于 2010-03-22T13:34:35.457 に答える
25

私の 3 つのアドバイス:

  • 単体テストを書きます。彼らは、あなたが進むにつれて、あなたの問題に合ったデザインに焦点を合わせるのに役立ちます. 事前に熟考した思考に (単独で) 依存するよりもはるかに優れています。
  • メモリ リーク検出器 (あらゆる種類のライブラリがあります) をインストールして、初日から実行します。プログラム/テストが終了するとすぐに、このライブラリにすべてのリークを出力させます。これにより、漏れを導入するとすぐに漏れを見つけることができるため、修理の痛みが大幅に軽減されます.
  • C で OOP コードを記述します。それほど難しくありません。メソッドのオーバーライドをエミュレートすることは可能ですが、単純なオブジェクトのエミュレーションから始めることをお勧めします。この単純なメカニズムでさえ、あなたに大きなマイレージを与えることができます.

次に例を示します。

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;
}
于 2010-03-23T05:22:31.930 に答える
22

Cでオブジェクト指向コードを書くというトピックをカバーする、ANSI-Cを使用したオブジェクト指向プログラミングというタイトルの優れた無料のオンラインブックがあります。 「オブジェクト指向C」をグーグル検索すると、他にも多くの優れたものが得られます。例とリソース。

プロジェクトがセーフティクリティカルである場合、MISRA-Cは優れたルールセットです。これは主に組み込みcを対象としていますが、他の領域でも役立つ場合があります。

私は自分自身をOOコーダーだと考えており、embedded-Cで多くの作業を行っています。特に大規模なプロジェクトの場合、私ができる最善のアドバイスは、やりすぎないことです。ANSI C上に完全なOOフレームワークを作成することは非常に魅力的ですが、それを正しく行うには多大な時間と労力がかかります。手の込んだものが多いほど、実際のプロジェクトで作業する代わりに、フレームワークのデバッグに多くの時間を費やすことになります。頭をすっきりさせ、 YAGNIをしっかりと把握して課題に取り組みます。頑張ってください!

于 2010-03-22T13:36:06.110 に答える
8

OOP は技術ではなく方法論です。したがって、私の最初のアドバイスは、それを手続き型プログラミングと考えるのをやめることです。

e.James の指摘によれば、オブジェクト指向言語を再作成しようとしたり、その機能を持っているふりをしたりしたくはありません。いくつかの単純な原則に固執することで、すべての正しいことを行うことができます。

  1. すべて試乗。
  2. 変化するものを見つけてカプセル化します。
  3. インターフェイスを設計します。
于 2010-03-23T05:08:49.123 に答える