2010-08-09 8 views
12

Immaginate Sto usando una classe di riportare gli elementi da un database, diconoL'uso di molti metodi su una classe aumenta il sovraccarico dell'oggetto della classe?

class BankRecord { 

public int id; 
public int balance; 

public void GetOverdraft() { 
... 
} 
public void MakeBankrupt(){ 
... 
} 

} 

Ora, che cosa accadrebbe alle prestazioni di utilizzo di questo se ci fossero solo 2 metodi (come sopra) o 100 metodi, forse alcuni di loro molto grandi.

L'istanziazione di centinaia di questi oggetti sarebbe peggiore se tutti i metodi fossero su ciascun oggetto? Questo è per i linguaggi di tipo C#/java, ma sarebbe bene sapere per tutte le lingue.

Oppure è una buona pratica avere una classe separata, eseguire tutte le azioni su questi oggetti e lasciare l'oggetto come una classe di dati pura?

+5

Risposta breve, ** no **. Risposta lunga, aspetta che qualcun altro risponda con una spiegazione del perché. – jjnguy

+1

Le prestazioni di esecuzione non dovrebbero essere influenzate. Tuttavia, è molto probabile che avere 100 metodi di grandi dimensioni ridurranno le prestazioni degli ingegneri che saranno indubbiamente assunti tra qualche anno per mantenere il codice. Si consiglia di considerare la scomposizione della logica e dei dati in pezzi più piccoli, più gestibili e verificabili individualmente. –

+0

Grazie, totalmente d'accordo sul fatto che 100 metodi non sono giusti la maggior parte del tempo, ma volevo solo rendere chiaro l'esempio. –

risposta

7

Il runtime non duplica il codice durante la creazione di un'istanza di un oggetto. Solo i campi membri vengono allocati in memoria quando viene creata un'istanza. Per questo motivo, non dovresti creare classi "solo dati" a meno che tu non abbia qualche altra ragione per farlo.

Detto questo, ci sono altre buone ragioni per cui potresti non volere una classe con una moltitudine di metodi (ad esempio lo God object anti-pattern).

4

No. Negli oggetti CLR è presente un puntatore alla meta informazione di quel tipo che include tutto il necessario per la riflessione e la tabella dei metodi. L'overhead per cercare un'implementazione del metodo nella tabella dei metodi è lo stesso indipendentemente dal numero di voci nella tabella. Vedere this article per ulteriori informazioni. In poche parole tutti gli oggetti hanno 8 byte di overhead (4 per il tipo handle e 4 per il syncblock).

Tuttavia, ciò che potrebbe essere essere più lento è la riflessione. Rende solo perché se si desidera enumerare attraverso i metadati di un tipo, allora sarà più lento se ci sono più membri dichiarati in quel tipo.

Problemi correlati