2011-02-07 13 views
19

Después de haber dedicado un poco de tiempo a aprender sobre programación funcional, cada vez es más natural para mí querer trabajar con métodos estáticos que no realizan ninguna mutación.Debería preferir los métodos estáticos en C#

¿Hay alguna razón por la que debería frenar este instinto?

+0

Me he encontrado apoyándome de esta manera debido a la cantidad de programación simultánea/paralela que he estado haciendo. Estaría interesado en escuchar las opiniones de otras personas. +1, pregunta interesante. – spender

+1

También he sentido esto y he recibido miradas extrañas de mis colegas al sugerir que los métodos se refaccionarán en llamadas a funciones estáticas, dejando solo un simple script de lógica de mutación de estado en los métodos de miembro. Yo digo correr con eso. –

+1

¿Puedes definir 'no realizar ninguna mutación'? – CRice

Respuesta

19

La pregunta me resulta un poco extraña, porque los métodos y métodos estáticos que no realizan mutaciones son dos clasificaciones ortogonales de métodos. Puede tener métodos estáticos mutantes y métodos de instancia no conmutados.

Para mí, se ha vuelto más y más natural combinar programación funcional y oo; Me gusta instancia métodos que no realizan mutaciones. La programación funcional es más fácil de entender porque desalienta las mutaciones complejas; La programación OO es más fácil de entender porque el código y los datos en los que opera están muy juntos. ¿Por qué elegir? Abraza el poder de "y"; ¡Haz ambos!

12

Puede escribir programas de trabajo de esta manera, pero no es idiomático. Si quieres trabajar en un equipo, trataría de controlarlo. Si nadie más está leyendo tu código, vete loco.

+9

De acuerdo. Creo que es un error escribir programas C# que se parecen a los programas F #, y viceversa. Debe jugar cada idioma y marco de acuerdo a sus puntos fuertes, en lugar de tratar de encajarlos en un molde heredado de otro lenguaje o marco. Si realmente está vendido en el modelo de programación F #/Scala, programe en F # o Scala :-). –

-1

Hay muchas razones para frenar este instinto cuando se escribe OOP.

Estados y comportamientos de los objetos;

La clase estática y el método necesitan parámetros, y debe estar seguro de qué parámetros pasarán a métodos estáticos. Pero la clase se administra solo si el método relacionado con es estado.

Creo que solo esta razón es suficiente para frenar los modificadores estáticos.

Y por una razón clara, debemos escuchar a la Sra. Liskov. here

+0

¿Qué tiene que ver el LSP con los métodos estáticos de ayuda? –

+0

Me sorprendería si veo algún método modificado por static en helpers sin los parámetros "this". Los métodos de ayuda estáticos no son realmente "estáticos", solo se modifican por "estáticos". Alguien debe escribir algún método estático, y el mejor lugar en el cuerpo de la clase (no hay opción en C#) método debe definirse en una clase. –

+2

@Ben - Un método estático no puede ser sustituido, uno por otro, sin que los dependientes sepan la diferencia. Eso viola varios principios interconectados de SOLID, incluido LSP. Si su programa es muy estático, está estrechamente vinculado, lo que le exige cambiar el código en más lugares de lo que lo haría si estuviera organizado de otra manera, incluso como singleton. – KeithS

0

No completamente. Me gustan mis métodos de extensión, y Linq, pero un OO-language debe usarse en forma OO. Además, todo es imprescindible en la CPU, y para varias capas además de eso.

5

Por alguna razón pienso en esta cita cuando leí tu pregunta:

Usted puede escribir en cualquier idioma Fortran.

Si la intención de C# fuera puramente funcional, static sería innecesario porque todo sería estático por defecto. Si eres estricto respecto de seguir las prácticas de OOP y los principios SOLID, tu código se vuelve efectivamente funcional (sé que hay una cita sobre esto en alguna parte) por lo que terminas obteniendo lo mejor de ambos mundos.

La razón por la que lo limitaría en un proyecto multiusuario sería que no es C# típico (es realmente C# con esposas). Solo necesitas que una persona rompa la regla y declare una propiedad mutable estática y todo se va al infierno.

0

Gran pregunta.

Creo que la respuesta depende del contexto de lo que hace su código y de cuánto es estático.

Mi código ha estado viendo menos casos estáticos ya que programo muchas interfaces ahora y marco algunos métodos como 'protegido virtual' en lugar de 'estático' para casos como extracción de prueba de unidad y patrón de modificación.Sin embargo, eso no significa que no puedas llamar a los métodos estáticos de.

Cuestiones relacionadas