Principi di progettazione, le migliori pratiche e modelli di progettazione per C (o programmazione procedurale in generale)? [chiuso]

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

  •  21-09-2019
  •  | 
  •  

Domanda

Ci sono principi di progettazione noti, migliori pratiche e modelli di progettazione che si possono seguire durante la progettazione di un progetto di C? O principi di progettazione utili per procedurale (imperativo) programmazione in generale?

(io sono figlio della 'generazione object-oriented' e hanno di progettare un grande progetto C per la prima volta)

È stato utile?

Soluzione

Informazioni nascondersi -. Come esposto da Parnas ( Software Fondamenti )

L'attenta gestione delle intestazioni e visibilità:

  • Il tutto in un file di origine che può essere nascosto dal mondo esterno dovrebbe essere; soltanto l'interfaccia esterna documentata deve essere esposto.
  • Tutto ciò che è esposto è dichiarato in un colpo di testa.
  • Tale intestazione viene utilizzato quando è necessaria la funzionalità (e dove è definito).
  • L'intestazione è a sé stante - quando ne avete bisogno, si usa, e non si hanno a preoccuparsi di 'quello che altre intestazioni devo includere anche' perché l'intestazione assicura funziona includendo tutto ciò di cui ha bisogno per farlo funzionare.
  • L'intestazione è auto-protetto -. Quindi non importa se è incluso più volte

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    ...rest of header contents, including other #include lines if necessary
    #endif /* HEADER_H_INCLUDED */
    
  • set di progettazione di funzioni per lavorare su 'oggetti' (di solito strutture) - e utilizzare tali funzioni, piuttosto che rovistando le interiora della struttura nel codice che lo utilizza. Pensate a come incapsulamento auto-imposto.

Altri suggerimenti

C'è una buona, libero, prenotazione online, dal titolo Programmazione orientata agli oggetti con ANSI-C , che copre il tema della scrittura di codice orientato agli oggetti in C. un ricerca google per "object-oriented C" produce anche una serie di altri buoni esempi e risorse.

Se il progetto è critico per la sicurezza, MISRA-C è un buon set di regole. Esso è destinato principalmente per c embedded, ma può essere utile in altre aree.

Mi considero un codificatore OO, e faccio un sacco di lavoro con embedded-C. Il miglior consiglio che posso dare, soprattutto per i progetti di grandi dimensioni, è non esagerare. La creazione di un quadro completo OO in cima ANSI C può essere molto allettante, ma ci vuole una grande quantità di tempo e fatica per farlo bene. Il più elaborato si ottiene, più tempo vi permetterà di trascorrere il debug quadro invece di lavorare sulla reale di progetto. Affrontare il compito con una testa chiara, e una buona, solida comprensione dei YAGNI . Buona fortuna!

I miei tre consigli:

  • test di scrittura unità. Essi vi aiuterà a zero su un design che suite vostro problema come si va avanti. Molto meglio che fare affidamento (solo) sulla pre-meditato pensiero.
  • Avere un rilevatore di perdite di memoria (ci sono tutti i tipi di librerie là fuori) installato e funzionante dal primo giorno. Avere questa stampa biblioteca fuori tutte le perdite non appena il programma / test uscite. Questo vi permetterà di prendere una perdita, non appena si introduce esso, rendendo in tal modo il suo fissaggio molto meno doloroso.
  • Scrivi il codice OOP in C. Non che difficile. Mentre è possibile emulare il metodo predominante, io suggerisco di iniziare con l'emulazione di oggetti semplici. Anche questo semplice meccanismo può dare grande distanza in miglia.

Ecco un esempio:

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 è un non metodologia di una tecnologia. Così il mio primo consiglio è smettere di pensare a esso come programmazione procedurale.

Per il punto di e.James, non si vuole cercare di ricreare un linguaggio orientato agli oggetti o di far finta di avere le capacità della stessa. È ancora possibile fare tutte le cose giuste aggrappandosi ad alcuni semplici principi:

  1. Test drive tutto.
  2. Trovare quello variabile e incapsulare esso.
  3. design nei interfacce.

SEI CERT C standard di codifica fornisce Buono insieme di regole e buone prassi comuni così come le cose si dovrebbe cercare di evitare di usare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top