2012-08-01 14 views
7

Me he dado cuenta de que los métodos estáticos parecen ser más populares en F # que C#. En C#, que siempre había añade un elemento a una colección llamando a un método de instancia:F # estilo de codificación - métodos estáticos vs instancia

mySet.Add(elem); 

Pero en F # por lo general hay un método estático equivalente:

mySet.Add(elem) 
// OR 
Set.Add elem mySet 

y he visto el este último se forma con bastante frecuencia en las muestras. Ambos me parecen completamente idénticos tanto semánticamente como funcionalmente, pero viniendo de un fondo de C#, usar el método de instancia parece más natural. ¿Cuál es el mejor estilo en F # y por qué?

+0

Relacionados: http://stackoverflow.com/q/7698133/162396 – Daniel

+0

mover para responder. –

+0

Hay tantas razones, enraizadas en la programación funcional como un todo, y algunas en particular en F #, es difícil saber por dónde empezar para justificarlo. Una vez que se familiarice con la programación funcional, se volverá obvio. – Daniel

Respuesta

8

Además de los motivos mencionados en esa respuesta relacionada con la inferencia de tipo, en el estilo funcional es más natural enviar una función como parámetro. Si se trata de un método de instancia, tendrá que escribir algo como esto:

myHigherOrderFunction (fun (x:MyType) -> x.myFunctionAsMethod) 

Pero si se define como un método estático puede escribir:

myHigherOrderFunction MyType.myFunctionAsMethod 

que es más elegante, más fácil write (para leer también) y es casi la misma sintaxis que cuando se envía una función regular de let.

Un método instancia requiere una instancia del tipo para acceder a la función (el método), en OOP esto no es un problema porque piensas en enviar mensajes a objetos pero en FP, las funciones solo (sin instancias) son ciudadanos de primera clase.

Para acceder a un método estático necesita especificar la clase, puede ver la clase como un tipo de contenedor (como módulos o espacios de nombres) con funciones.

+0

casos de uso excelente en el estilo fp. Y en la programación de estilo oo, las funciones de instancia son más cortas. – nicolas

0

En f # como lenguaje funcional más nativo para separar variables que son inmutables y funciones que son operaciones. Esto funciona de forma similar a los métodos estáticos en C#, pero hay una ventaja de las funciones para los métodos C#. Es una aplicación parcial. Puede pasar para funcionar algunos parámetros (no todos) y esta función con parte de parámetros será una función nueva que necesita otros parámetros.

5

La mayoría de los tipos F # estándar son inmutables. Cuando se trabaja con objetos inmutables, los métodos estáticos mejor retratan lo que está pasando, por ejemplo:

mySet.Add(elem); 

Parece que mySet está mutado para incluir elem, cuando un conjunto F # volvería un nuevo mySet. Afortunadamente, F # no se compila para asegurarse de no cometer este error, pero aún así genera un código confuso. Por el contrario:

mySet |> Set.Add elm 

es distinta en forma y parece que va a regresar algo nuevo, sin ser demasiado lejos de la original.

2

Si bien los métodos estáticos en F # son muy comunes, creo que los métodos de instancia tienen mucho sentido para el desarrollo de componentes.

¿La razón? El sistema de módulos F # carece de funtores. En otros sabores de ML como SML u OCaml, desarrolla componentes como módulos simples. Si luego decide parametrizar el módulo, puede promocionarlo a un administrador sin reescribir demasiado su código fuente. En F # no puedes.

Para crear un "módulo" parametrizado en F #, debe recurrir a una clase y convertir sus métodos en métodos de instancia, pasando los parámetros durante la construcción de la instancia. Desafortunadamente, pasar de un módulo a una clase implica un gran cambio mecánico pero molesto en el código fuente. Por lo tanto, un programador de componentes duros puede optar por trabajar con clases y métodos de instancia de forma predeterminada, igual que en C#. Esto es una reminiscencia de un estilo "functor-only" que a veces se emplea en SML.

Cuestiones relacionadas