2012-04-08 14 views
7

¿Con qué frecuencia debo usar métodos estáticos en general? Si tengo como:Usando método estático vs. método de objeto

Class1 _class34 = new Class1(parameter); 

Class1.DoSomething(_class34, parameter1, parameter2, parameter3, parameter4). 

o

_class34.DoSomething(parameter1, parameter2, parameter3, parameter). 

estoy teniendo una tendencia de llamar al método estático de una clase y pasando un objeto de la clase como en el primer ejemplo?

¿Cuál es la mejor práctica con respecto a estos dos ejemplos? ¿Hay alguna actuación, diseño y prácticas generales a las que deba prestarle atención? ¿Cuál debería usar en general y cuál elegiría en los escenarios de codificación diaria? El primer ejemplo parece más fácil de leer (pasas todos los parámetros y haces algo), en el segundo tienes que leer dos veces que estás trabajando en un objeto.

No es realmente un gran problema, solo me pregunto.

Respuesta

11

En general, los métodos estáticos solo se deben usar cuando lo que quiera hacer es independiente de cualquier instancia de la clase. Si necesita acceder directamente o afectar el estado de una instancia en particular, un método no estático suele ser el camino a seguir.

+1

De acuerdo. Por supuesto, siempre hay excepciones pero, en general, si se encuentra pasando una instancia de clase A a un método estático de clase A, probablemente lo esté haciendo mal. –

+0

¿Qué sucede en casos en los que está pasando dos instancias de Clase A a un método donde ninguna instancia 'posee' o tiene prioridad en la operación? –

+1

¿Te refieres a una operación binaria conmutativa? Lo he visto de ambas maneras, pero probablemente aún usaría un método no estático. – Taymon

0

si necesita el objeto, creo que debe hacer la llamada como "_class34.Do Something (parameter1, parameter2, parameter3, parameter)."

cuando lo lees es como: Sobre el objeto _Clase34, haz Algo, con estos parámetros.

2

No hay una respuesta "más frecuente".
Todo depende del tipo de uso.

La línea inferior es: Si un objeto de la clase especificada se efectúa/usa, siempre debe usar métodos no estáticos. Sin embargo, si no hay una única instancia de la clase que se efectúa/utiliza, siempre debe usar métodos estáticos.

En su ejemplo usted está haciendo Class1.DoSomething(_class34, parameter1, parameter2, parameter3, parameter4) que no es un buen enfoque, ya que elimina todas las posibilidades que le ofrece la programación orientada a objetos (como el polimorfismo, etc.).

Un buen ejemplo para un escenario en el que se necesitaría una función estática son los métodos de fábrica como String.Parse, que comienzan sin una instancia específica de String, pero que están conectados a la clase de cadena.

+0

Otro ejemplo común es cargar un objeto desde un archivo, que a menudo se implementa como una descarga estática del objeto cargado desde el archivo. – Ricibob

2

Esto es lo que el tiempo de ejecución ya hace, cada método de instancia tiene un primer argumento oculto que pasa este. Expuesto en la sintaxis de un método de extensión.

Hacer explícitamente el trabajo del tiempo de ejecución no es particularmente útil, la sintaxis se vuelve más prolija. Y es doloroso dado el tipo de nombre que tiene que inventar. Considere _this en lugar de _clase34 :)

0

Toda la idea detrás de la programación orientada a objetos es que no tiene que escribir somefunction(somestruct) como lo haría en el pasado, pero puede escribir somestruct.somefunction(), lo que lo hace mucho más claro que somefunctionpertenece a somestruct.

Por supuesto que puede hacerlo de la manera que desee, pero recuerde que su segundo ejemplo es el modo, el motivo por el que se inventaron las funciones miembro.

0

Los miembros estáticos pueden complicar las pruebas unitarias, por lo que debe tener cuidado con la forma de usarlos.

En la mayoría de los casos, termino agregando envoltorios no estáticos para las clases que contienen miembros estáticos ya que de otro modo no podría burlarme de ellos.

Static Methods are Death to Testability podría darle una mejor idea de esto.

0

Pero de manera predeterminada, uso métodos de instancia. Tiendo a usar statics solo cuando tiene más sentido que los métodos de instancia o cuando no hay otra manera. El uso de estática puede complicar las pruebas unitarias. Los métodos estáticos que también usan campos estáticos son una fuente potencial de pérdidas de memoria (sí, incluso en .NET).

Así, por ejemplo, yo uso la estática cuando quieren tener un método de creación especial para hacer más claro lo que sucede durante la creación, al igual que cuando creo objeto deserializar desde un archivo:

MyClass myObject = MyClass.ReadFromFile("serialized.xml"); 

¿Qué es más fácil de leer que:

MyClass myObject = new MyClass("serialized.xml"); 

también utilizo métodos de la estática (y miembros) cuando quiero compartir alguna información de estado a nivel de clase entre todas las instancias.

Por supuesto, los miembros estáticos son imprescindibles cuando toda la clase es estática.

Cuestiones relacionadas