|
C++ Manuale di Stile (Edizioni Infomedia) Riepilogo delle raccomandazioni |
Ho pensato di fare cosa utile rendendo disponibile
in formato HTML l'elenco delle raccomandazioni discusse all'interno
del libro. Questo sia per i potenziali lettori sia per chi, avendo
acquistato il libro, vuole avere la possibilita' di distribuire
delle copie dell'elenco, eventualmente modificate, all'interno
di un team di sviluppo.
Per chi non avesse letto il libro, e' importante osservare che tutte le
raccomandazioni non vengono "imposte" al lettore senza giustificazione,
ma derivate da una analisi delle alternative, valutando le ragioni di
ogni scelta nell'ottica della programmazione professionale.
E' ora disponibile on-line l'
errata corrige del libro.
Raccomandazione 1
Utilizzare identificatori piu' lunghi e descrittivi
per gli elementi privi di contesto; limitare la lunghezza degli
identificatori quando il contesto aiuta a comprenderne il significato
logico.
Raccomandazione 2
Scegliete gli identificatori nel dominio del problema,
non in quello della soluzione.
Raccomandazione 3
Sviluppate delle convenzioni locali per i prefissi
piu' comuni, come indici e numero di elementi; non lasciate pero'
che il prefisso prenda il sopravvento sul corpo dell'identificatore.
Raccomandazione 4
Evitare nomi che differiscono solo nel case o solo
per caratteri simili, come 1 ed l ("uno" ed "elle
minuscola") oppure 0 ed O ("zero" ed "o maiuscola").
In realta' sarebbe opportuno evitare totalmente l'uso dei numeri
negli identificatori.
Raccomandazione 5
Cercate di evitare l'uso contemporaneo di piu lingue:
sceglietene una (preferibilmente l'Inglese) e restate coerenti
con tale scelta durante l'intero sviluppo.
Raccomandazione 6
Scegliete i nomi delle classi dal dominio del problema;
il nome dovrebbe normalmente rappresentare il tipo di dato astratto,
non la specifica implementazione.
Raccomandazione 7
Funzioni "pure" devono avere un nome che
rappresenti adeguatamente il risultato restituito.
Raccomandazione 8
Funzioni con side-effects (procedure) devono avere
un nome che descriva ad un giusto livello di astrazione tutti
i compiti eseguiti. Usate un verbo seguito da un complemento oggetto
per le funzioni non membro, ed un verbo per le funzioni membro,
lasciando l'oggetto implicito.
Raccomandazione 9
Scegliete gli identificatori di variabile e costante
per rappresentarne l'uso, riferendovi al dominio del problema
e non all'implementazione; utilizzate identificatori corti se
il loro uso e' chiarito dal contesto locale, ed identificatori
lunghi per variabili globali o con lifetime estesa.
Raccomandazione 10
Sviluppate ed adottate una convenzione di codifica
che permetta una scelta di nomi consistente tra gli sviluppatori.
Raccomandazione 11
Ogni include file deve contenere un meccanismo che
eviti le definizioni multiple, e possibilmente anche le inclusioni
multiple.
Raccomandazione 12
Utilizzare nomi di file unici in un ampio contesto:
se il file contiene l'header o l'implementazione di una classe,
usare il nome della classe seguito da una estensione opportuna.
Raccomandazione 13
Se il vostro progetto deve essere portabile su altre
piattaforme, isolate le parti dipendenti dall'hardware e dal sistema
operativo e spostatele in files separati. Considerate comunque
l'opportunita' di definire delle classi intermedie per isolare
l'applicazione dal sistema.
Raccomandazione 14
Limitate l'uso di funzionalita' specifiche del compilatore;
spostate sempre le parti di codice dipendenti dal compilatore
in files separati.
Raccomandazione 15
Se l'accesso ad una classe all'interno di un header
file avviene solo tramite reference o puntatore, non includete
l'header di tale classe, ma dichiarate semplicemente l'identificatore
della classe nell'header stesso.
Raccomandazione 16
Se utilizzate gli header precompilati, includete
gli header di libreria per primi, poi gli header piu' stabili,
ed infine quelli piu' frequentemente modificati; usate il meccanismo
del vostro compilatore per fermare la precompilazione dopo gli
header di sistema o dopo quelli piu' stabili.
Raccomandazione 17
Racchiudete i nomi degli header di libreria tra <>
e degli header privati tra "".
Raccomandazione 18
Non specificate le directory nei file header inclusi:
utilizzate il supporto del compilatore per specificare le directory
da utilizzare.
Raccomandazione 19
Utilizzate una diversa directory per i moduli oggetto
di ogni progetto.
Raccomandazione 20
Utilizzate linee vuote per separare elementi logicamente
distinti, anche all'interno della singola funzione o blocco applicativo.
Cercate di limitare gli elementi decorativi nei commenti, che
deviano l'attenzione di chi legge.
Raccomandazione 21
Indentate gli statement subordinati sotto agli statement
da cui dipendono.
Raccomandazione 22
Definite uno standard di indentazione che sia rispettato
da ogni membro del team di sviluppo.
Raccomandazione 23
Definite uno standard interno sulla lunghezza e l'uso
del tab che sia rispettato da tutti i programmatori del team.
Raccomandazione 24
Definite uno standard per la sequenza delle dichiarazioni
in un file header, ed aderitevi strettamente ogni volta che sia
possibile.
Raccomandazione 25
Il file di implementazione deve definire ogni elemento
nell'esatto ordine di dichiarazione del file header associato.
Raccomandazione 26
Usare una spaziatura uniforme tra gli operatori e
gli operandi; vi sono sicuramente eccezioni, ma anche su queste
cercate di essere consistenti con un vostro standard di layout.
Raccomandazione 27
Utilizzate le parentesi solo quando sono necessarie
ai fini semantici, o per chiarire la priorita' e/o l'associativita'
degli operatori.
Raccomandazione 28
Spezzate le espressioni troppo complesse, in particolar
modo le espressioni booleane, assegnandone una sottoespressione
significativa ad una variabile locale.
Raccomandazione 29
Utilizzate sempre le parentesi per chiarire il significato
di espressioni che coinvolgono operatori bit-wise ed altri operatori.
Questo e' valido anche quando gli operatori bit-wise sono overloaded,
come nel caso degli operatori << e >> per l'I/O su
stream.
Raccomandazione 30
Specificare il nome dei parametri formali sia nel
file header che nel file di implementazione, ed utilizzare gli
stessi identificatori in entrambi i contesti.
Raccomandazione 31
Se un parametro formale non e' utilizzato, racchiudere
il suo nome in un commento nel file implementazione.
Raccomandazione 32
Evitare l'allineamento nelle dichiarazioni di variabili:
utilizzare semplicemente una spaziatura standard.
Raccomandazione 33
Dichiarare una sola variabile in ogni statement di
dichiarazione.
Raccomandazione 34
Variabili di tipo puntatore (o di tipo riferimento)
vanno dichiarate giustapponendo il simbolo * (o il simbolo &)
al tipo dell'oggetto puntato (o referenziato), ovvero come nell'esempio
che segue:
int* x ;
Raccomandazione 35
Se utilizzate tipi complessi, ad esempio puntatori
a funzione, dichiarate un tipo apposito con typedef.
Raccomandazione 36
Utilizzate sempre la struttura di controllo che meglio
esprime le azioni che intendete compiere ad un livello piu' astratto.
Raccomandazione 37
Preferire il break o un flag al return per uscire
dai loop.
Raccomandazione 38
Se il body di uno statement e' vuoto, posizionate
il ';' o un blocco vuoto su una riga separata, ed annotatelo con
un commento.
Raccomandazione 39
Nei cicli for, utilizzate un limite inferiore inclusivo
ed un limite superiore esclusivo.
Raccomandazione 40
Usare il nesting con discernimento: talvolta e' possibile
linearizzare la struttura del codice con un impatto trascurabile
sulle prestazioni.
Raccomandazione 41
Ogni clausola di uno statement switch va terminata
con break o con return, salvo i casi di fall-through intenzionale
che devono sempre essere commentati.
Raccomandazione 42
Introdurre sempre una clausola default negli statement
switch; se il controllo non deve mai raggiungere tale clausola,
inserire una asserzione falsa come corpo, in modo che ogni violazione
delle assunzioni fatte venga segnalata a run-time.
Raccomandazione 43
Strutturate la dichiarazione di una classe ordinando
le sezioni di accessibilita' come pubblica/protetta/privata, seguite
da classi, funzioni, operatori friend.
Raccomandazione 44
All'interno di ogni sezione, seguite un layout il
piu' vicino possibile a quello di un file header, con le dovute
differenze per i membri statici.
Raccomandazione 45
La definizione delle funzioni inline non va inserita
all'interno della dichiarazione della classe, ma al di fuori di
essa.
Raccomandazione 46
Nei commenti, cercate di spiegare le vostre intenzioni,
non come le state realizzando. Preferite i commenti introduttivi
a quelli esplicativi, che spesso si possono evitare scrivendo
codice piu' chiaro.
Raccomandazione 47
Indentare i commenti allo stesso livello del codice
a cui si riferiscono.
Raccomandazione 48
Evitare di inserire esplicitamente valori numerici
nel codice: definire invece delle opportune costanti.
Raccomandazione 49
Non utilizzare #define per definire le costanti,
ma const o enum.
Raccomandazione 50
Usare enum per raggruppare costanti omogenee; utilizzare
const per dichiarare costanti eterogenee.
Raccomandazione 51
Se una o piu' costanti sono utilizzate solo all'interno
di una classe, o come parametri per le funzioni membro di una
classe, le costanti vanno definite internamente alla classe, e
dotate del giusto grado di visibilita' (private, protected o public)
a seconda dell'impiego che possono avere.
Raccomandazione 52
Utilizzare sempre il tipo piu' opportuno per ogni
variabile; non abusare dei tipi int o float: talvolta unsigned
puo' essere piu' indicato.
Raccomandazione 53
Non utilizzare i tipi predefiniti esplicitamente
qualora sia possibile (e significativo) nascondere l'implementazione
definendo un opportuno tipo con typedef od enum.
Raccomandazione 54
Non dichiarate diverse variabili logicamente correlate
se definendo una opportuna classe e' possibile riunirle in un'unica
struttura.
Raccomandazione 55
Dichiarare le variabili in modo da avere vita e scope
minimi, ovvero all'ultimo istante possibile, e con il massimo
grado di annidamento possibile.
Raccomandazione 56
Inizializzare le variabili al momento della dichiarazione
ogni volta che e' possibile; altrimenti, considerare la possibilita'
di astrarre parte del codice in una funzione.
Raccomandazione 57
All'interno dei blocchi, non dichiarare variabili
aventi lo stesso identificatore di una variabile visibile nello
stesso scope.
Raccomandazione 58
Considerate sempre le variabili locali static come
candidati a divenire membri di una opportuna classe: se si trovano
all'interno di funzioni membro, possono divenire membri della
stessa classe; se si trovano in funzioni non-membro, dovra' essere
introdotta una nuova classe, se corrisponde ad una astrazione
significativa.
Raccomandazione 59
Non utilizzare una variabile dichiarata in uno statement
di selezione o di iterazione, al di fuori dello statement stesso:
il codice non rispettera' lo standard ISO C++.
Raccomandazione 60
Minimizzare l'uso delle variabili globali.
Raccomandazione 61
Se e' necessario introdurre un oggetto globale, costruire
una opportuna classe che gestisca l'elemento come una risorsa,
eventualmente con gli opportuni costrutti di locking.
Raccomandazione 62
Non dichiarare funzioni private come virtual.
Raccomandazione 63
Se si modifica la visibilita' di una funzione in
una classe derivata, motivare le ragioni della modifica con un
opportuno commento.
Raccomandazione 64
Non eccedere nel numero di costruttori: introducete
solo quelli realmente necessari. Attenzione ai costruttori con
un solo parametro, che sono a tutti gli effetti operatori di conversione.
Raccomandazione 65
Non chiamare funzioni virtuali all'interno del costruttore:
non verranno in ogni caso legate dinamicamente, ma sempre legate
staticamente. Se e' necessario chiamarle, introducete comunque
un commento esplicativo.
Raccomandazione 66
Parametri di tipo puntatore o reference nei costruttori
dovrebbero sempre essere const, in modo tale che il costruttore
non modifichi i suoi parametri.
Raccomandazione 67
Ogni classe avente funzioni virtuali, o utilizzata
come classe base in una gerarchia di derivazione, deve dichiarare
il distruttore come virtual. Negli altri casi, commentate opportunamente
l'header della classe, cosi' che l'introduzione di classi derivate
coincida con la modifica del distruttore in virtual.
Raccomandazione 68
Nei costruttori di oggetti composti da piu' parti,
inizializzate i sotto-oggetti con la tecnica <whole> :
<part>, non tramite assegnazione. L'assegnazione e' di norma
preferibile per i sottocomponenti di tipo base.
Raccomandazione 69
Una classe che abbia membri allocati dinamicamente
deve definire un opportuno costruttore di copia.
Raccomandazione 70
Una classe che abbia membri allocati dinamicamente
deve definire un opportuno distruttore.
Raccomandazione 71
Evitare, se possibile, l'uso di oggetti globali all'interno
dei costruttori. Se e' necessario, utilizzate la tecnica di Schwarz
per garantire il corretto ordine di inizializzazione.
Raccomandazione 72
I costruttori ed i distruttori non dovrebbero essere
inline, tranne per classi base molto semplici, dalle quali non
di derivera' in futuro, o nei casi in cui siano vuoti.
Raccomandazione 73
Non definire dati pubblici o protetti: tutti i dati
devono essere privati.
Raccomandazione 74
Non definire metodi di get/set pubblici, e limitarsi
il piu' possibile anche nel caso di metodi protected: cercate
di identificare piu' chiaramente le responsabilita' ed i compiti
della classe, anziche' esporne i dati. Se definite metodi di get/set
protected, usate astrazioni a livello logico.
Raccomandazione 75
Limitare l'uso di struct all'interfacciamento con
codice C; utilizzare le classi in tutti gli altri casi.
Raccomandazione 76
Funzioni od operatori pubblici che restituiscano
puntatori o reference a campi di una classe devono restituirli
come puntatori/reference const.
Raccomandazione 77
Funzioni o operatori pubblici non devono restituire
il valore di un membro di tipo puntatore o reference, se non sotto
forma di puntatore const o reference const.
Raccomandazione 78
Non definite operatori di conversione pubblici che
restituiscano puntatori/reference a membri o membri puntatore/reference:
utilizzate invece funzioni membro dal nome esplicativo, che ricordino
al programmatore la sua responsabilita' nell'utilizzo del puntatore/reference
ottenuto, che deve comunque essere const.
Raccomandazione 79
In ogni classe, limitate il numero di chiamate a
funzioni virtuali dichiarate nella classe stessa.
Raccomandazione 80
Per ogni funzione virtuale dichiarata in una classe
e richiamata nel codice della classe stessa, documentare adeguatamente
nel file header della classe ogni contesto di chiamata. Specificate
chiaramente quali vincoli sul contesto verranno rispettati in
future versioni della classe (e rispettateli!) e quali possono
essere variati senza preavviso.
Raccomandazione 81
Nelle gerarchie di derivazione con ereditarieta'
singola, l'uso di inherited :: per qualificare la classe genitore
puo' semplificare significativamente la manutenzione della gerarchia
stessa.
Raccomandazione 82
L'uso della qualificazione esplicita con :: dovrebbe
essere limitato all'interno delle classi base (per ottenere l'early
binding con il metodo della classe stessa) o nelle classi derivate
(per richiamare i metodi delle classi base). Non dovrebbe essere
usato al di fuori di esse, dove oggetti delle classi vengono usati.
Raccomandazione 83
Funzioni che non modificano lo stato dell'oggetto
vanno dichiarate const; cio' andrebbe fatto sin dalla fase di
definizione dell'interfaccia della classe.
Raccomandazione 84
Se possibile, non modificate oggetti globali o sotto-oggetti
accessibili tramite puntatori all'interno di funzioni membro const,
e non eseguite input-output all'interno di esse. Se dovete farlo,
commentate adeguatamente il codice, e magari anche la dichiarazione
della funzione.
Raccomandazione 85
Dovendo modificare membri dato all'interno di un
oggetto, ammesso che cio' sia concettualmente corretto, dichiarate
i dati come mutable; in alternativa, usate const_cast all'interno
della funzione membro che deve modificare i dati, od un cast esplicito
se const_cast non e' disponibile.
Raccomandazione 86
Se un operatore viene ridefinito, la sua semantica
dovrebbe risultare il piu' possibile naturale; gli operatori della
stessa famiglia logica dovrebbero essere a loro volta ridefiniti
in modo che vengano preservate le usuali equivalenze semantiche.
Raccomandazione 87
Non ridefinite gli operatori || ed && se
non e' veramente necessario; se dovete farlo, aggiungete sempre
una linea di commento nel file header, richiamando esplicitamente
la mancanza di short-circuit nella valutazione.
Raccomandazione 88
Una classe che abbia membri allocati dinamicamente
deve definire un opportuno operatore di assegnazione.
Raccomandazione 89
Un operatore di assegnazione che esegua operazioni
distruttive sul suo operando di sinistra, deve per prima cosa
verificare la non-identita' dei due operandi.
Raccomandazione 90
Il parametro di destra di un operatore di assegnazione
dovrebbe essere const; nei rari casi in cui cio' non e' possibile,
commentare adeguatamente l'header della classe.
Raccomandazione 91
Il risultato di un operatore di assegnazione dovrebbe
essere di tipo void oppure un reference const alla classe per
la quale l'operatore e' definito.
Raccomandazione 92
Le funzioni friend non devono accedere ai dati privati
della classe; se necessario, definire delle funzioni inline private
di Get/Set, per accedere ai dati membro.
Raccomandazione 93
Legge di Demeter (formulazione "per oggetti")
Un metodo M della classe C dovrebbe richiamare solo
metodi della classe C, metodi delle sottoparti immediate di C,
metodi degli argomenti di M, metodi degli oggetti creati internamente
ad M o metodi di oggetti globali.
Raccomandazione 94
Non usate i reference per creare degli alias; se
dovete creare alias, utilizzate i puntatori.
Raccomandazione 95
Per ottenere il passaggio per riferimento, utilizzate
sempre i tipi reference e non i puntatori. Se il fine del passaggio
per riferimento e' di evitare la copia di un oggetto di grosse
dimensioni, che non verra' comunque modificato, dichiarare il
parametro come un reference const.
Raccomandazione 96
Limitare l'uso dell'aritmetica sui puntatori: in
molte occasioni, l'uso diretto degli array generera' codice piu'
leggibile, sicuro, ed altrettanto efficiente.
Raccomandazione 97
Utilizzate una classe Array basata su template anziche'
gli array C-style.
Raccomandazione 98
Utilizzate sempre delete[] per distruggere array
di oggetti, e delete per distruggere i singoli oggetti.
Raccomandazione 99
Dopo la chiamata a delete o delete[], assegnate il
valore NULL alla variabile nel caso si tratti di un membro di
una classe o di una variabile globale. Lo stesso vale se si tratta
di una variabile locale il cui scope si estende per molte righe
dopo la sua distruzione.
Raccomandazione 100
Minimizzate l'uso di puntatori a puntatore.
Raccomandazione 101
Evitate l'uso di parametri booleani; definite invece
un apposito tipo enumerato per le diverse opzioni. Il tipo puo'
essere definito internamente ad una classe per evitare la saturazione
dello spazio degli enumerati
Raccomandazione 102
Non restituite puntatori ad elementi statici o globali
come risultato delle funzioni.
Raccomandazione 103
Non restituite, come risultati di funzione, puntatori
a memoria allocata all'interno della funzione, e che debba essere
deallocata dal chiamante.
Raccomandazione 104
Se una funzione deve restituire dati creati dinamicamente,
considerate l'opportunita' di creare una classe wrapper che gestisca
l'allocazione/deallocazione dei dati.
Raccomandazione 105
Non restituite valori eterogenei come risultato delle
vostre funzioni; se necessario, utilizzate un ulteriore parametro
per codici di errore, o generate una eccezione a run-time.
Raccomandazione 106
Inserite asserzioni nel codice per verificare precondizioni,
postcondizioni ed invarianti. Le asserzioni vanno utilizzate per
trovare errori di codifica, non per gestire errori run-time dovuti
all'interazione con l'ambiente.
Raccomandazione 107
Non inserite codice che genera side-effect all'interno
delle asserzioni: tale codice non verra' compilato come parte
della release finale.
Raccomandazione 108
Se la condizione verificata all'interno di una asserzione
non e' di immediata comprensione, commentatela adeguatamente.
Raccomandazione 109
Evitate di scrivere funzioni troppo lunghe; se vi
sono importanti ragioni per non suddividere una funzione lunga
in sottofunzioni, documentate le motivazioni con un opportuno
commento.
Raccomandazione 110
Utilizzare le funzioni inline anziche' definire macro-funzioni
con #define.
Raccomandazione 111
Utilizzate le funzioni inline solo se vi sono concreti
motivi: il fatto che una funzione sia breve non giustifica di
per se' l'espansione in linea.
Raccomandazione 112
Utilizzare le funzioni inline solo quando l'overhead
di chiamata e' significativo rispetto al tempo di esecuzione del
corpo della funzione stessa. Funzioni di forwarding o funzioni
protected di accesso ai membri dato sono normalmente buoni candidati
all'espansione in linea.
Raccomandazione 113
Tutte le versioni overloaded di una stessa funzione
dovrebbero avere la stessa semantica, perlomeno ad un alto ma
riconoscibile livello di astrazione.
Raccomandazione 114
Non utilizzare i parametri di default per simulare
l'overloading in una sola funzione: una funzione dovrebbe svolgere
un unico compito.
Raccomandazione 115
Parametri di default devono essere forniti solo quando
la maggior parte delle chiamate sfruttera' effettivamente tali
parametri.
Raccomandazione 116
Limitare il passaggio per valore di oggetti di grandi
dimensioni, e la restituzione per valore di oggetti di grandi
dimensioni.
Raccomandazione 117
Evitare codice che dipende dalla lifetime di oggetti
temporanei; se cio' e' necessario per ragioni di efficienza, commentare
la porzione di codice in modo adeguato.
Raccomandazione 118
Se lavorate con oggetti di grande dimensione, non
utilizzare operatori postfissi; se create una classe con oggetti
di grandi dimensione, non definite operatori postfissi.
Raccomandazione 119
Utilizzate la derivazione pubblica o protetta solo
se state effettivamente modellando una relazione del tipo e'-un.
Negli altri casi, utilizzate l'ereditarieta' privata o il contenimento.
Raccomandazione 120
Non restiruire mai un puntatore ad una classe base
attraverso una funzione pubblica o protetta di una classe derivata
con ereditarieta' privata.
Raccomandazione 121
Se una funzione di una classe derivata come private
chiama una funzione virtuale della classe base, e' necessario
legarla staticamente alla funzione della classe base, evitando
la risoluzione dinamica della chiamata.
Raccomandazione 122
Non ridefinire funzioni virtuali di una classe base
non accessibile.
Raccomandazione 123
La derivazione privata da una classe base che chiama
al suo interno funzioni virtuali dovrebbe essere sostituita dal
contenimento diretto.
Raccomandazione 124
Non ridefinite le funzioni non virtuali delle classi
basi in classi derivate public o protected (ereditarieta' di
interfaccia); nel caso occorra farlo, verificate che non sia comunque
piu' corretto derivare come private (ereditarieta' di implementazione)
Raccomandazione 125
Se utilizzate il binding statico per eliminare l'ambiguita'
dovuta all'ereditarieta' multipla, commentate adeguatamente il
codice per prevenire problemi di manutenzione; considerate comunque
l'alternativa di utilizzare i puntatori a funzioni membro.
Raccomandazione 126
L'ereditarieta' fork-join accessibile deve sempre
essere virtuale.
Raccomandazione 127
L'ereditarieta' fork-join non accessibile non deve
mai essere virtuale.
Raccomandazione 128
Quando e' possibile, utilizzate l'ereditarieta' virtuale
ogni volta che derivate in modo pubblico o protetto.
Raccomandazione 129
L'ereditarieta' privata dovrebbe sempre essere non-virtual.
Raccomandazione 130
Attenzione all'overloading di funzioni parametrizzate
e non parametrizzate nei template, che puo' impedire l'istanziazione
con alcuni parametri. Preferibilmente, spostate le funzioni non
parametriche in una classe base.
Raccomandazione 131
Dati e funzioni membro di un template che siano indipendenti
dai parametri del template possono essere spostate in una classe
base da cui il template e' derivato.
Raccomandazione 132
Non usare un cast, di nessun tipo, quando e' possible
utilizzare l'operatore di qualificazione esplicita ::
Raccomandazione 133
Se e' realmente necessario convertire un puntatore
a classe base ad un puntatore a classe derivata, o in generale
invertire una conversione implicita, utilizzate l'operatore static_cast
e non un cast C-style. Se vi e' la possibilita' che la conversione
fallisca, utilizzate dynamic_cast.
Raccomandazione 134
Nei rari casi in cui e' realmente necessario convertire
oggetti const in oggetti non-const, utilizzate l'operatore const_cast.
Raccomandazione 135
Nei rari casi in cui sia realmente necessario eseguire
un cast che puo' fallire a run-time, utilizzate l'operatore dynamic_cast,
non il cast C-style.
Raccomandazione 136
Se e' realmente necessario eseguire un cast tra tipi
scorrelati, utilizzate l'operatore reinterpret_cast, non il cast
C-style.
Raccomandazione 137
In caso di possibile ambiguita', utilizzare un cast
esplicito anziche' appoggiarsi al meccanismo di cast implicito
del linguaggio.
Raccomandazione 138
Non richiedere mai un cast implicito o esplicito
da un array di oggetti di classe derivata ad un array di oggetti
di classe base.
Raccomandazione 139
Utilizzare gli stream di I/O anziche' printf ovunque
sia possibile.
Raccomandazione 140
Non assumete che il vostro codice sia portabile ad
un altra piattaforma o semplicemente ad un altro compilatore solo
perche' funziona con il vostro sistema e compilatore.
Raccomandazione 141
Compilate sempre il vostro codice con il massimo
numero di warning abilitati; eliminate i warning rimuovendone
la causa, non zittendo il compilatore. Evitate l'uso dei #pragma.
Raccomandazione 142
Non fate assunzioni arbitrarie sulle grandezze dei
tipi, specialmente sulle grandezze relative di short, int, long,
e puntatori. Usate i tipi standard per contenere le differenze
tra puntatori. Se e' necessario fare riferimento alla dimensione
di un tipo base, definite un apposito tipo utilizzando la compilazione
condizionale.
Raccomandazione 143
Non assumete un particolare layout di memorizzazione
per i tipi base.
Raccomandazione 144
Se usate i bit-field, non trattate mai una sequenza
di campi come una singola unita'.
Raccomandazione 145
Non fate assunzioni sul layout in memoria degli oggetti.
Raccomandazione 146
Non comparate puntatori a tipi diversi. Gli operatori
<, <=, >, >= sono definiti solo per puntatori che
puntano all'interno dello stesso array, o al primo elemento dopo
la fine dell'array stesso.
Raccomandazione 147
Non assumete che la chiamata di funzione comporti
la valutazione degli argomenti in un ordine particolare.
Raccomandazione 148
Gli operandi di un operatore con side-effect non
devono avere altre occorrenze nella stessa espressione.
Raccomandazione 149
Non utilizzate l'ereditarieta' per modellare relazioni
del tipo tutto-parti, che vanno modellate con il contenimento.
Raccomandazione 150
Quando possibile, utilizzate la composizione diretta
per i sotto-oggetti, non la composizione tramite puntatori.
Raccomandazione 151
Non utilizzate schemi di type-checking dinamico per
ottenere genericita': preferite invece l'uso dei template.
Raccomandazione 152
Se i tempi di ricompilazione dopo la modifica di
parti private delle classi sono troppo lunghi, minimizzate l'accoppiamento
tra le implementazioni delle classi usando una tecnica di isolamento.