2010-08-09 12 views
12

Imagínese que estoy usando una clase de traer de vuelta los artículos en una base de datos, dicen¿Tener muchos métodos en una clase aumenta la sobrecarga del objeto de esa clase?

class BankRecord { 

public int id; 
public int balance; 

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

} 

Ahora, ¿qué pasaría con el desempeño de usar este si había sólo 2 métodos (como el anterior) o 100 métodos, tal vez algunos de ellos muy grandes.

Instanciar cientos de estos objetos sería peor si todos los métodos estuvieran en cada objeto? Esto es para los idiomas del tipo C#/java, pero sería bueno saberlo para todos los idiomas.

¿O es una buena práctica tener una clase separada para realizar todas las acciones en estos objetos y dejar el objeto como una clase de datos pura?

+5

Respuesta corta, ** no **. Respuesta larga, espere hasta que alguien más responda con una explicación de por qué. – jjnguy

+1

El rendimiento de ejecución no debe verse afectado. Sin embargo, es muy probable que tener 100 métodos grandes reduzca el rendimiento de los ingenieros que sin dudas serán contratados dentro de unos años para mantener el código. Es posible que desee considerar la descomposición de su lógica y datos en piezas más pequeñas, más manejables y susceptibles de prueba individual. –

+0

Gracias, estoy totalmente de acuerdo en que 100 métodos no son correctos la mayor parte del tiempo, pero solo quería dejar claro el ejemplo. –

Respuesta

7

El tiempo de ejecución no duplica el código al crear una instancia de un objeto. Solo los campos miembros tienen espacio asignado en la memoria cuando se crea una instancia. Por esta razón, no debería crear clases "solo para datos" a menos que tenga alguna otra razón de diseño para hacerlo.

Dicho esto, existen otras razones de mejores prácticas por las que es posible que no desee una clase con una multitud de métodos (por ejemplo, God object anti-pattern).

4

No. En el CLR los objetos tienen un puntero a la metainformación de ese tipo que incluye todo lo necesario para la reflexión y la tabla de métodos. La sobrecarga para buscar una implementación de método en la tabla de métodos es la misma independientemente del número de entradas en la tabla. Ver this article para más información. En pocas palabras, todos los objetos tienen 8 bytes de sobrecarga (4 para el manejador de tipo y 4 para el bloque de sincronización).

Sin embargo, lo que podría ser más lento es la reflexión. Solo hace que si deseas enumerar a través de los metadatos de un tipo, será más lento si hay más miembros declarados en ese tipo.

Cuestiones relacionadas