C (または手続き型プログラミング全般) の設計原則、ベスト プラクティス、および設計パターン?[閉まっている]

StackOverflow https://stackoverflow.com/questions/2492446

  •  21-09-2019
  •  | 
  •  

質問

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

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

役に立ちましたか?

解決

情報隠蔽 - パルナス (ソフトウェアの基礎).

ヘッダーと可視性の慎重な管理:

  • ソース ファイル内で外界から隠すことができるものはすべて、次のようにする必要があります。文書化された外部インターフェイスのみを公開する必要があります。
  • 公開されるものはすべてヘッダーで宣言されます。
  • このヘッダーは、機能が必要な場所 (および機能が定義されている場所) で使用されます。
  • ヘッダーは自己完結型です。必要なときに使用できます。ヘッダーには、ヘッダーを作成するために必要なものがすべて含まれているため、ヘッダーが機能することが保証されているため、「他にどのようなヘッダーも含める必要があるか」について心配する必要はありません。仕事。
  • ヘッダーは自己保護されているため、複数回インクルードされても問題ありません。

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    ...rest of header contents, including other #include lines if necessary
    #endif /* HEADER_H_INCLUDED */
    
  • 「オブジェクト」(通常は構造体) で動作する関数のセットを設計し、それを使用しているコードで構造体の内部をいじるのではなく、それらの関数を使用します。これは、自ら課したカプセル化であると考えてください。

他のヒント

というタイトルの無料のオンライン本があります。 ANSI-C を使用したオブジェクト指向プログラミング, では、C でのオブジェクト指向コードの記述について説明します。あ Google検索 「オブジェクト指向 C」については、他にも多くの優れた例やリソースが得られます。

プロジェクトが安全性を重視する場合、 ミスラ-C 良いルールセットです。これは主に組み込み c を対象としていますが、他の分野でも役立つ可能性があります。

私は自分自身を OO プログラマーであると考えており、embedded-C で多くの作業を行っています。特に大規模なプロジェクトの場合、私ができる最善のアドバイスは、やりすぎないことです。ANSI C の上に完全な OO フレームワークを作成することは非常に魅力的ですが、適切に作成するには多大な時間と労力がかかります。凝れば凝るほど、フレームワークの開発に取り組む代わりに、フレームワークのデバッグに多くの時間を費やすことになります。 本物 プロジェクト。明晰な頭と、物事をしっかりと理解してタスクに取り組みます。 ヤグニ. 。幸運を祈ります!

私からの 3 つのアドバイス:

  • 単体テストを作成します。作業を進めながら、問題に適した設計に焦点を当てるのに役立ちます。事前に熟考した思考に(のみ)依存するよりもはるかに優れています。
  • メモリ リーク ディテクタ (あらゆる種類のライブラリが存在します) をインストールし、初日から実行します。プログラム/テストが終了するとすぐに、このライブラリですべてのリークを出力します。こうすることで、漏れが発生したらすぐに発見できるため、修理の痛みが大幅に軽減されます。
  • OOP コードを C で記述します。そんなに難しいことではありません。メソッドのオーバーライドをエミュレートすることは可能ですが、単純なオブジェクトのエミュレーションから始めることをお勧めします。この単純なメカニズムでも、優れた走行距離を実現できます。

以下に例を示します。

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;
}

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

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

  1. すべてを試乗してください。
  2. 何が変化しているのかを見つけて、それをカプセル化します。
  3. インターフェースからデザインまで。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top