2008-09-07 25 views
28

Además, ¿hay alguna ventaja de rendimiento para los métodos estáticos sobre los métodos de instancia?¿Cuándo debería ser un método estático?

me encontré con el siguiente recientemente: http://www.cafeaulait.org/course/week4/22.html:

Cuando un método debe ser estático?

  1. Ni lee de ni escribe a instancia campos
  2. independiente del estado del objeto
  3. métodos matemáticos que aceptan argumentos, aplicar un algoritmo para aquellos argumentos, y devolver un valor
  4. métodos de fábrica que sirven en lugar de constructores

estaría muy interesado en las votaciones de la Pila Comunidad de desbordamiento en esto.

Respuesta

20

Establezca métodos estáticos cuando no son parte de la instancia. No te preocupes por las micro-optimizaciones.

Puede encontrar que tiene muchos métodos privados que pueden ser estáticos pero siempre llama desde métodos de instancia (o entre ellos). En ese caso, realmente no importa mucho. Sin embargo, si quiere realmente poder probar su código, y quizás usarlo desde otro lugar, puede considerar hacer esos métodos estáticos en una clase diferente, no instanciable.

15

Si un método es estático o no es más una consideración de diseño que uno de eficiencia. Un método estático pertenece a una clase, donde un método no estático pertenece a un objeto. Si tuviste una clase de Matemáticas, podrías tener algunos métodos estáticos para tratar con la suma y la resta, porque estos son conceptos asociados con Matemáticas. Sin embargo, si tuviera una clase de automóvil, podría tener algunos métodos no estáticos para cambiar de marcha y dirección, porque están asociados con un automóvil específico, y no con el concepto de autos en general.

1

En cuanto a rendimiento, un método estático de C++ puede ser ligeramente más rápido que un método de instancia no virtual, ya que no es necesario pasar un puntero 'this' al método. A su vez, ambos serán más rápidos que los métodos virtuales ya que no se necesita una búsqueda de VMT.

Pero, es probable que sea justo en el ruido, especialmente para los idiomas que permiten optimizar el paso de parámetros innecesarios.

+0

Justo en el optimizado completamente por el compilador cuando es importante (la mayoría de las veces). –

+0

No se puede optimizar en C++. La persona que llama no tiene forma de saber que el destinatario no va a usar "esto", por lo que debe pasarlo independientemente. Para otros idiomas, YMMV. – Roddy

2

@jagmal Creo que tienes algunos cables cruzados en alguna parte, todos los ejemplos que mencionas claramente no son métodos estáticos.

Los métodos estáticos deben tratar completamente con las propiedades abstractas y los conceptos de una clase; no deben relacionarse de ninguna manera con los atributos específicos de la instancia (y la mayoría de los compiladores gritarán si lo hacen).

Para el ejemplo del coche, la velocidad, kms conducidos están claramente relacionados con los atributos. El cambio de marchas y el cálculo de velocidad, cuando se consideran a nivel de coche, dependen del atributo, pero considere una clase carModel que hereda del coche: en este punto podrían convertirse en métodos estáticos, ya que los atributos necesarios (como el diámetro de rueda) podrían definirse como constantes en ese nivel.

+3

Tienes razón. Realmente tenía cosas realmente confusas. Puede ser porque tuve problemas de sueño durante esos días. En el espíritu de SO, he eliminado el comentario y no creo que tenga nada más que agregar que lo que la gente ya haya contado. Gracias de todos modos. – Jagmal

2

Recuerde que cada vez que escribe un método estático, está escribiendo un método inflexible que no puede modificar su comportamiento muy fácilmente.

Está escribiendo el código de procedimiento, por lo que si tiene sentido ser procesal, hágalo. Si no, probablemente debería ser un método de instancia.

Esta idea está tomada de an article by Steve Yegge, que creo que es una lectura interesante y útil.

12

Otro problema con los métodos estáticos es que es bastante doloroso escribir pruebas unitarias para ellos, al menos en Java. No puedes burlarte de un método estático de ninguna manera. Hay un post on google testing blog about this issue.

Mi regla de oro es escribir métodos estáticos solo cuando no tienen dependencias externas (como acceso a bases de datos, archivos de lectura, correos electrónicos, etc.) para mantenerlos lo más simples posible.

+0

Gracias por esta respuesta. A menudo hago que algunos métodos sean estáticos (porque en realidad no forman parte directa de la instancia). Pero ahora evito que esos métodos sean estáticos porque estás en lo cierto con ellos, esa burla no será posible – flipperweid

0

Otra cosa a tener en cuenta al hacer los métodos estáticos es que cualquier persona que pueda ver la clase puede llamar a un método estático. Mientras que cuando el mehtod es un método de instancia, solo aquellos que tienen acceso a una instancia pueden llamar a ese método.

Cuestiones relacionadas