2012-02-09 7 views
5

Al mio datore di lavoro, è politica utilizzare gli elenchi di inizializzazione nel costruttore perché è più efficiente.Svantaggio per l'elenco di inizializzazione di grandi dimensioni?

Tuttavia, sto sviluppando una classe che ha 45 membri di dati che richiedono l'inizializzazione. Secondo la politica, questo dovrebbe essere fatto in un elenco di inizializzazione nel costruttore.

Oltre alla leggibilità, quale sarebbe lo svantaggio di un elenco di inizializzazione di grandi dimensioni?

+1

Oltre alla leggibilità? Non riesco a pensare a nulla, oltre al potenziale errore. –

+7

Suggerimento: se si dispone di 45 attributi membro, è possibile che le responsabilità non vengano suddivise in modo appropriato. –

risposta

8

È possibile formattare un elenco di inizializzatore membro su più linee di origine fisiche, in modo da evitare problemi di leggibilità.

Il problema più grande è ovviamente il fatto che si hanno classi con 45 membri dati. Nulla renderà particolarmente facile lavorare con tali classi.


AClass::AClass(type1 val1 
       , type2 val2 
       // ... 
       , type45 val45) 
: mem1(val1) 
, mem2(val2) 
// ... 
, mem45(val45) 
{ 
} 

sostengo non è meno leggibile di:

AClass::AClass(type1 val1 
       , type2 val2 
       // ... 
       , type45 val45) 
{ 
    mem1 = val1; 
    mem2 = val2; 
    // ... 
    mem45 = val45; 
} 
8

penso che potrebbe valere la pena di fare un passo indietro per capire il motivo per cui la classe ha 45 membri di dati. Questo di solito è un segno che la tua classe sta facendo troppe cose e ha troppe responsabilità separate che renderà questa classe molto difficile da mantenere nel tempo.

Sembra che tu possa aver bisogno di suddividere la tua classe in pezzi funzionali separati e avere il delegato di classe 'controllore' in sottoclassi. Questo diminuirà la complessità del tuo codice in modo drammatico.

-1

Alcune ottimizzazioni falliranno, ho il sospetto che l'inlining di tale costruttore non funzioni.

In entrambi i casi: 45 I membri dati suonano molto. Puoi raggrupparli oggetti così aggregati?

+1

perché dovrebbero fallire con un elenco di inizializzazione e non senza un elenco di inizializzatore (in cui copiare le inizializzazioni nel corpo)? – KillianDS

3

Sembra anti-pattern noto Oggetto div.. citazione Wiki:

In object-oriented programming, a God object is an object that knows too much or does too much.

Si prega di trovare un modo per rivedere il vostro disegno ai membri del gruppo dell'oggetto Dio in strutture e piccoli oggetti con le proprie procedure di inizializzazione.

Quindi una risposta alla domanda "che cosa sarebbe lo svantaggio di una grande lista di inizializzazione? (Confronto ad uno piccolo)" potrebbe essere "E 'grande, quindi probabilmente si tratta di un cattivo stile."

Una risposta alla domanda "quale sarebbe lo svantaggio di un elenco di inizializzazione di grandi dimensioni (rispetto a un corpo del grande costruttore)" potrebbe essere "nessuno", perché l'inizializzazione è meglio fare nell'elenco, non nel corpo, ma leggibilità e un costo di manutenzione lo stesso (come per me).

+1

Quale parte di questo risponde alla domanda sugli svantaggi di elenchi di inizializzazione di grandi dimensioni? –

+0

La parte che dice "se si dispone di elenchi di inizializzazione di grandi dimensioni, quindi * che * è un problema." –