Robustezza
Controllo sistematico di tutti i casi di errore previsti (possibilmente mediante eccezioni); [PoP99]
- Logging dettagliato del control-flow e dei risultati intermedi (nelle applicazioni in cui e' possibile);
- Utilizzare classi intrinsecamente robuste (string, vector, list) al posto delle soluzioni ad-hoc;
- Evitare l'uso di buffers di dimensione fissa o introdurre altri limiti arbitrari nel codice;
- Rilasciare sempre e comunque tutte le risorse acquisite (memoria, handles, file descriptors, etc.);
- Usare assert() sistematicamente per il controllo delle precondizioni, postcondizioni e altri controlli di consistenza (design by contract);
- Usare preferibilmente controlli statici a compile-time anziche' a run-time (per esempio, STATIC_ASSERT() al posto di assert());
Manutenibilita'
- Non utilizzare variabili globali;
- Non introdurre magic numbers nel codice;
- Non duplicare il codice;
- Rispettare il principio della minima sorpresa;
- Scrivere funzioni brevi;
- Scrivere funzioni che facciano solamente una cosa (principio di coesione);
- Utilizzare nomi brevi, ma descrittivi (difficile quando non si rispettano le regole precedenti);
Documentazione
- La documentazione deve trovarsi piu' vicina possibile al codice a cui si riferisce;
- Aggiornare la documentazione quando si modifica il codice;
Utilizzare Doxygen come spiegato in DevelerCoding;
- Documentare (anche con riferimenti esterni) gli algoritmi non banali;
- Documentare i blocchi di codice non immediatamente ovvi;
- Documentare le motivazioni che hanno portato ad una certa soluzione;
- Documentare eventuali pitfalls per chi modifichera' il codice;
Riferimenti
[Pop99] Brian W.Kerninghan, Rob Pike - The Practice of Programming