2009-07-09 13 views
7

La mayoría de los programadores hoy en día usan conceptos OOPS para el desarrollo de software.¿Cómo influye la programación funcional en su estilo de codificación?

Pero algunos de ellos también están expuestos a la programación funcional.

¿Cómo influye la programación funcional en su estilo de codificación?

+2

wiki de la comunidad por favor. –

+0

no es una pregunta real? – dfa

+0

¿Cómo es que esto no es una pregunta real? Esta es una pregunta perfectamente válida. El OP desea saber cómo la programación funcional cambia el estilo de codificación, de la misma manera que el OOP cambia el estilo de codificación cuando se aplica. – Joseph

Respuesta

6

uso principal ha estado pasando funciones en funciones de orden superior como el filtro y el mapa (¿Dónde y Seleccione en .Net) Este es realmente el mayor impacto, que le permite escribir cosas como las operaciones de configuración sólo una vez, a continuación, cosas que actúan o modifican conjuntos.

así que cosas como

var SquareOfEvenIntegers = MyListOfInts 
    .Where(i=>even(i)) 
    .Select(i=>i*i); 

en lugar de

List<int> SquareOfEvenIntegers = new List<int>() 
foreach(int i in MyListOfInts) 
{ 
    if (even(i)) 
    { 
     SquareOfEvenIntegers.Add(i*i);    
    } 
} 
5

Me resulta mucho más fácil escribir código de subprocesos múltiples ahora.

Tiendo a tener menos variables de nivel de clase que antes.

También tiendo a tener interfaces que son funcionalmente independientes ... una vez más que tiene una gran ganancia cuando se trata de multi-threading, ya que puede reducir en gran medida la cantidad de bloqueo de objetos siempre que sus hilos sean también funcionalmente independientes.

También tiendo a tener pesadillas sobre el cierre de llaves que me persiguen.

4

Dos cosas vienen a la mente procedente de la programación funcional que estoy adoptando:

  • Cambio de métodos vacíos que alteran las variables de clase de métodos que devuelven valores
  • hacer que las clases inmutables en lugar de tener clases con los emisores (JavaBeans antipattern)
+0

+1, Ambos reducen el acoplamiento en su sistema. – gradbot

+0

casi palabra por palabra lo que estoy pensando –

3

Al haber escrito una buena porción de Haskell, me resulta mucho más fácil utilizar Linq en SQL en mi código C#.

Me inclino ahora por la escritura de código que toma un resultado y devuelve un resultado, en lugar de modificar una variable como un efecto secundario.

He escrito grandes fragmentos de código de procedimiento y funcional, que me facilita el factorizar mi código en trozos más pequeños que son más de un estilo u otro. Cuando solo conocía la programación procedural/oop, tenía menos herramientas en mi caja de herramientas mental.

Leer fuentes de la biblioteca en Haskell me ha enseñado cómo hervir mejor mi código para separar las abstracciones de la tarea real.

¡He ganado mucho escribiendo Haskell!

1

Controladores de eventos que son cierres;

button.OnClick += (sender, args) => MessageBox.Show("we captured " + someCapturedVariable); 
+0

Eso es realmente bastante imperativo. – Zifre

+0

Depende de lo que quiere decir con 'funcional'."En este caso, me refería a lambdas, creación de cierre automático y objetos de función de primera clase. –

1

me parece que el movimiento de Python 3.x a iteradores viene muy natural para mí, ya que me recuerda a la evaluación perezosa de Haskell.

Realmente, ya sea usando Python 2.xo Python 3.x, list comprehensions, map, itertools, operator y (para extender un poco menos) functools, ¡son mis amigos!

2

De alguna manera, me ha sorprendido lo mucho que he estado usando inconscientemente la programación de estilo funcional, sin reconocerlo por lo que era.

Por ejemplo, en Java hago un uso intensivo de construcciones en colecciones de Commons como Transformer y Predicate, que son esencialmente cierres, pero implementadas como interfaces Java. A continuación, utiliza las funciones de utilidad proporcionadas para transformar y filtrar elementos en una colección. Esto va en contra de la forma imperativa "estándar" de hacer este tipo de cosas en Java.

Estas, por supuesto, son operaciones vainilla de mapa y filtro, pero las estaba usando instintivamente sin darme cuenta de qué se trataba. Eso me sugiere que el estilo funcional es en gran medida intuitivo, incluso si no se lo informan.

+0

De hecho, la programación funcional permite un mayor nivel de abstracción y suena como si estuvieras buscando alcanzarla. – gradbot

1

Como la programación funcional es ortogonal a OOP, realmente me ha abierto los ojos a cómo estructurar mis clases.

  • Tiendo a tener interfaces más significativas que se parecen a los conceptos.
  • Mi código está mejor desacoplado y tengo clases significativamente más pequeñas. Es raro que yo cree una clase solo para implementar un patrón.
  • Creo menos setters, en cambio llamo a diferentes funciones de miembros que calculan el valor que quiero y lo pasan a un único setter.
  • Antes de la programación funcional, nunca pensaría en pasar una función como parámetro como solución mientras trato de resolver un problema. Ahora, esta solución simplemente aparece en mi cabeza y realmente me ayuda con DRY.
  • Mi código contiene más expresiones en lugar de enunciado.
  • Si una solución lo permite me inclino hacia la evaluación perezosa.
0

La programación funcional y OO no son conceptos disjuntos. Una falla en los lenguajes funcionales que veo es su falta de expresividad ADT. Lo más parecido que he visto a la programación funcional en un lenguaje OO es Eiffel. Por las funciones de la convención son referencialmente transparentes, sería ideal si esto se aplicara.

Cuestiones relacionadas