Design-Prinzipien, Best Practices und Design Patterns für C (oder prozeduralen Programmierung im Allgemeinen)? [geschlossen]

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

  •  21-09-2019
  •  | 
  •  

Frage

Gibt es irgendwelche bekannten Design-Prinzipien, Best-Practices und Design-Muster, dass man folgen kann, während ein C-Projekt entwerfen? Oder nützliche Gestaltungsprinzipien für verfahren (zwingend notwendig) Programmierung im Allgemeinen?

(Ich bin Kind der ‚objektorientierte Generation‘ und habe ein großes C-Projekt zum ersten Mal entwerfen)

War es hilfreich?

Lösung

Versteck Informationen - wie von Parnas eintritt ( Software Fundamentals )

Die sorgfältige Verwaltung von Kopf- und Sichtbarkeit:

  • Alles in einer Quelldatei, die von der Außenwelt verborgen werden kann, sollte sein; nur die dokumentierten externe Schnittstelle ausgesetzt werden sollte.
  • Alles, was ausgesetzt ist, in einem Header deklariert.
  • Das Header wird verwendet, wenn die Funktionalität benötigt wird (und wo es definiert ist).
  • Der Header ist in sich geschlossen - wenn Sie es brauchen, verwenden Sie es, und Sie müssen sich keine Sorgen über ‚was andere Header muss ich auch schließen‘, weil die Kopf sorgt es funktioniert, indem alles einschließlich es braucht Damit es funktioniert.
  • Der Header ist selbst geschützt -. So dass es keine Rolle, wenn es mehrmals enthalten ist

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    ...rest of header contents, including other #include lines if necessary
    #endif /* HEADER_H_INCLUDED */
    
  • Konstruktions Sätze von Funktionen zur Arbeit auf ‚Objekten‘ (in der Regel Strukturen) - und eher diese Funktionen verwendet, als in dem Code um die Innereien der Struktur stößt, die es verwendet. Betrachten Sie es als selbst auferlegte Kapselung.

Andere Tipps

Es gibt eine gute, kostenlose online Buch mit dem Titel Objektorientierte Programmierung mit ANSI-C , der das Thema behandelt schreiben objektorientierten Code in C A MISRA-C ist ein guter Satz von Regeln. Es ist beabsichtigt, vor allem für Embedded-c, es kann aber auch in anderen Bereichen nützlich sein.

Ich halte mich für einen OO-Codierer, und ich habe eine Menge Arbeit mit Embedded-C. Der beste Rat kann ich, vor allem für große Projekte gibt, ist es nicht zu übertreiben. sein kann, ein komplettes OO Rahmen auf der ANSI-C-Erstellen sehr verlockend, aber es braucht viel Zeit und Mühe, es richtig zu machen. Die schicker, desto mehr Zeit erhalten Sie Ihren Rahmen, anstatt zu arbeiten auf dem real Projekt verbringen debuggen. Nähern Sie sich die Aufgabe mit einem klaren Kopf und ein gutes, solides Verständnis der YAGNI . Viel Glück!

Meine drei Hinweise:

  • schreiben Unit-Tests. Sie helfen Ihnen, auf Null in einem Design, das Ihr Problem Suiten, wie Sie gehen zusammen. Viel besser als unter Berufung (allein) auf Pre-meditierte Denken.
  • Haben Sie einen Speicherleckdetektor (es gibt alle Art von Bibliotheken da draußen) installiert und vom ersten Tag an läuft. Lassen Sie sich diese Bibliothek Ausdruck alle Lecks, sobald das Programm / Tests beendet. Dies ermöglicht es Ihnen, ein Leck so schnell zu fangen, wie Sie es einführen, wodurch seine Befestigung viel weniger schmerzhaft.
  • Code über OOP in C nicht so schwierig. Während es möglich ist zwingende Methode zu emulieren, schlage ich vor, dass Sie mit Emulation von einfachen Objekten beginnen. Auch dieser einfachen Mechanismus können Sie große Kilometer geben.

Hier ist ein Beispiel:

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 ist eine Methodik, keine Technologie. Also meine erste Bit der Beratung ist als prozeduralen Programmierung davon Stop Denken.

Um e.James der Punkt, Sie nicht wollen, um zu versuchen, und erstellen Sie eine objektorientierte Sprache oder so tun, dass Sie die Fähigkeiten davon haben. Sie können immer noch die richtigen Dinge durch Haften an ein paar einfachen Grundsätze tun:

  1. Probefahrt alles.
  2. Finden Sie, was es variiert und einzukapseln.
  3. Design-Schnittstellen.

SEI CERT C Coding Standard bietet Gut Satz von Regeln und Gemeinwohl Praktiken sowie Dinge, die Sie sollten versuchen, mit zu vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top