variable method may language-agnostic oop static-methods

language agnostic - method - Cuándo hacer un método estático?



static method python 3 (7)

Me gustaría saber cómo las personas deciden si definir un método como estático. Soy consciente de que un método solo se puede definir como estático si no requiere acceso a los campos de instancia. Entonces, digamos que tenemos un método que no accede a los campos de instancia, siempre define dicho método como estático, o solo si necesita llamarlo estáticamente (sin una referencia a una instancia).

Quizás otra forma de hacer la misma pregunta es si usa estático o no estático como predeterminado.


(C #) De manera predeterminada, uso métodos estáticos en clases estáticas y métodos no estáticos en clases no estáticas.

Al elaborar una clase, me encuentro convergiendo de forma natural en hacerla totalmente estática o completamente no estática. Hablando en términos prácticos, si comienzo a querer definir miembros estáticos dentro de una clase no estática, a menudo encuentro que finalmente tendrá más sentido dividirlos en una clase estática separada, ya sea una clase de utilidad como Matemáticas o una aplicación global clase (como el ConfigurationManager de .NET).

Desde una perspectiva orientada a objetos, un método está haciendo algo a / con un objeto. Entonces, si está utilizando un objeto instanciado, tiene más sentido para mí pensar que los métodos de ese objeto no son estáticos. Técnicamente, técnicamente puede hacer que una clase no estática tenga miembros estáticos si no requieren acceso a una instancia. Pero ostensiblemente, al menos, los métodos de una clase seguirían haciendo algo a / con esa clase, por lo que aún los convertiría en no estáticos. En igualdad de condiciones, eso es todo.


Depende. En los idiomas en que son posibles las funciones no miembro, diría que la mayoría de las veces, si el método se puede hacer estático, se debe hacer una función no miembro en su lugar, no amigo, si es posible. Puedes decir que tengo un fondo mayormente de C ++.

En los lenguajes OO "puros" donde las funciones no miembro no son posibles, esto dependerá de si el método es solo "incidentalmente" estático (es decir, simplemente no necesita acceder a los miembros de la instancia), o es lógicamente estático: es un método de toda la clase en lugar de para una instancia particular.


No estático por defecto, estático cuando necesito que la funcionalidad esté disponible desde al menos dos clases diferentes, y no quiero desperdiciar un constructor.

PD. ¡Reglas de Arquímedes!


Si el método depende únicamente de sus argumentos, puede hacerlo estático. Si el método no instancia ninguna otra de sus clases definidas por el usuario, puede hacerlo estático. Sin embargo, el valor predeterminado es tenerlo como no estático.


Use métodos estáticos cuando realice operaciones que no operan en instancias de la clase.

Un ejemplo perfecto sería un método sqrt de una clase de Math .


Yo uso métodos estáticos siempre que puedo. Ventajas:

  • Al llamar a un método estático desde dentro de un método de instancia, puede estar seguro de que no hay efectos secundarios en el estado del objeto actual.
  • Desde dentro de un método estático, puede estar seguro de que no modifica accidentalmente ningún estado de la instancia del objeto.
  • Puede usar un método estático desde fuera de la clase sin construir una instancia. Si fue posible hacer el método estático, claramente no necesita una instancia, por lo que no es necesario que lo requiera.
  • Los métodos estáticos pueden ser un poco más eficientes porque no se debe pasar el puntero "this", y no es necesario el envío dinámico.

Kevin Bourrillion escribió una respuesta perspicaz sobre este tema hace algún tiempo (desde una perspectiva de Java, pero creo que también se aplica a otros idiomas).

Él argumenta que básicamente solo debes usar métodos estáticos para funciones puras .

Una " función pura " es cualquier método que no modifique ningún estado y cuyo resultado no dependa más que de los parámetros que se le proporcionan. Por lo tanto, por ejemplo, cualquier función que realice E / S (directa o indirectamente) no es una función pura, pero Math.sqrt (), por supuesto, sí lo es.

Yo tiendo a estar de acuerdo. (Aunque en mi propio código, tradicionalmente, probablemente utilicé demasiados métodos de ayuda estática por todas partes ... :-P Y esto seguramente ha dificultado la prueba del código que usa esos métodos).