2010-01-29 20 views
8

Estoy refaccionando algunos códigos y estoy buscando una clase llamada HFile. HFile tiene todos los constructores privados para que no puedas crear instancias de él. En lugar de crear instancias de HFiles de la siguiente manera:Consejos para evitar el uso excesivo de métodos estáticos

var file = new HFile('filename') 
file.Save() 

toda la interacción de HFile se maneja a través de métodos estáticos. Así que si quería guardar un archivo que yo llamaría:

HFile.save('filename') 

y luego internamente una instancia de HFILE ello origina y luego se guarda. Obviamente, sin conocer toda la historia, cualquier lector debe reservarse el juicio, pero parece que el uso de métodos estáticos se ha puesto de moda en mi lugar de trabajo. Así que me pregunto si existen buenos principios/mejores prácticas para el uso de métodos estáticos que puedan ser útiles para un grupo de muchachos sentados y revisando el uso de métodos estáticos.

+3

Poner el lenguaje o la plataforma en las etiquetas sería una buena idea. –

Respuesta

5

En general, si su situación requiere encapsulación de estado o una estructura organizativa, entonces estará utilizando clases.

Por otro lado, si tiene algo que es una preocupación transversal, y se puede utilizar ampliamente en su aplicación, puede considerar los métodos en una clase de utilidad estática. System.Math en .NET framework (y Java) es un ejemplo de esto.

En su ejemplo, HFile es probablemente un objeto con estado, por lo que generalmente no utilizaría un método estático para guardarlo. Es más simple hacer una llamada a un método en el objeto HFile específico, en lugar de tener que pasar todo el objeto a un método estático para guardar. Si eso tiene sentido o no en su aplicación particular depende de si el paradigma de su aplicación ve objetos HFile como cosas que se transmiten y actúan por métodos externos, o como objetos independientes capaces de salvarse.

5

Los métodos estáticos son difíciles de probar porque no se pueden descartar. Por esta razón, tendemos a evitarlos en mi lugar de trabajo. Aunque los usamos para métodos de fábrica.

+0

Me gustaría agregar que los métodos de fábrica estáticos son aceptables para usar en la clase que ejemplifica todas sus dependencias (por ejemplo, métodos Guice @Provides), pero usar métodos de fábrica estáticos en el código regular perjudica la capacidad de prueba porque, al usar métodos estáticos ordinarios, bloquea tu código para usar una implementación particular y evita que te burles de la dependencia. – MageWind

2

Esto no está muy orientado a objetos, ¿o sí? Ahora tal vez su lugar realmente no le gusta el código OO, y eso está bien. Pero si desea encapsular datos y métodos, entonces necesita métodos de instancia para trabajar en esos datos.

La abundancia de métodos estáticos probablemente esté asociada con muchas variables globales. P.ej. la información que intenta guardar en el nombre de archivo debe ser global si va a llamar a un HFile.save ('nombre de archivo') estático. Generalmente tratamos de reducir los globales para mantener las cosas más manejables.

Pero si quiere escribir el código de procedimiento, está bien.

+1

Los métodos estáticos son excelentes cargadores (un tipo de método de fábrica). También me parece muy fructífero usarlos en bloqueos de recursos para evitar retrasar otros procesos. –

10

Muchos de los métodos estáticos/clases estáticas son un síntoma de proceduralitis: escribir código de procedimiento en un lenguaje orientado a objetos. La mejor manera que conozco para eliminar este tipo de pensamiento es una comprensión profunda de los principios y prácticas orientados a objetos. Usar el desarrollo basado en pruebas y forzar que el código sea comprobable ayudará, porque es mucho más difícil escribir pruebas para clases estáticas. Eventualmente, si usa TDD, naturalmente se inclina hacia arquitecturas OO más desacopladas, aunque solo sea para aliviar el dolor de prueba.

+1

Las pruebas de métodos estáticos son las más fáciles de escribir, siempre que no tenga ningún estado estático. –

+2

@RobertHarvey Eso es cierto si se trata de una función pura sin efectos secundarios y sin dependencias (o si todas las dependencias se dan como parámetros). Honestamente, no veo muchas clases así. Además, hacer uso de aquellos en otras clases puede ser muy difícil si necesita eliminar la dependencia de su uso, que es probablemente la razón por la que no los veo muchos ya que enfatizo la capacidad de prueba. – tvanfosson

+0

Esos son los únicos tipos de métodos estáticos que escribo. Mire la clase de Matemáticas en .NET Framework para un ejemplo representativo. –

2

Los métodos IMO estáticos no son útiles para el propósito que ha descrito es común en su lugar de trabajo. Desventajas de este método:
- ¿De qué sirve crear un objeto que represente un archivo básicamente para llamar solo a un método?
- no puede usar basado en la interfaz de polimorfismo

Para responder a su pregunta, aquí hay algunos casos en los que yo usaría un método estático:
- un método de utilidad que hace algo relacionado con la funcionalidad de la clase, no, pero a cualquier objeto Tal vez se necesita una variedad de objetos y los compara. Quizás haga algo de manipulación de datos genéricos (conversiones, etc.).
- donde tiene que hacer cosas relacionadas con su clase con variables de clase
- en la que desea aplicar un patrón de diseño Singleton

3

yo no me preocuparía por el número de métodos estáticos tanto como lo haría en lo estos métodos están haciendo. ¿Un método estático que devuelve un valor o modifica un objeto que pasa como argumento? No es gran cosa. ¿Un método estático que modifica los campos estáticos privados? Me preocupa. ¿Un método estático que modifica los campos estáticos públicos que pertenecen a otras clases? Necesito acostarme en una habitación oscura con una toalla húmeda sobre mi frente.

+0

Estoy de acuerdo. ¡Personalmente nunca necesité utilizar métodos estáticos para modificar variables estáticas privadas o variables estáticas mucho peores de otra clase! –