2011-04-28 7 views
6

¿Es práctico implementar un modelo de objetos en un estilo funcional?¿Modelo de objeto en estilo funcional?

Un problema que OOP parece sobresalir en describir modelos de objetos.

Por ejemplo, un HTML DOM es una bestia complicada y con estado que interactúa directamente con la interfaz de usuario y requiere programación de idiomas dinámicos. características de POO tienden a resultar muy útil en muchos sentidos:

  • limitaciones de acceso miembros ponen a la interfaz con código no confiable (por ejemplo Javascript) salvo
  • funciones y propiedades Accessor hacen que la unión a la interfaz de usuario mucho más conveniente
  • No tener que pasar todo el tiempo por el modelo de objetos hace que los métodos sean mucho más simples.

El lado de la interfaz de usuario de la historia podría ser un poco discutible si se está proyectando el modelo a través de MVVM, pero usted todavía está en constante lucha con el estado interno.

Estoy trabajando en F # para este proyecto, así que podría recurrir fácilmente a OOP, pero tengo curiosidad sobre hasta qué punto puedo empujarlo antes de que se vuelva poco práctico. ¿Hay quizás patrones de diseño o algo así?

+0

OCaml, F #, CLOS, Clojure, Haskell y Scala - además de todos los modismos orientados objetados en otros lenguajes como Erlang ...Sí, diría que funciona bastante bien para ellos. OOP no tiene que manipular el estado, es principalmente (en mi opinión) para la organización y DRY. –

+0

Lo he visto hecho con Leskah, y miré el código, pero desafortunadamente está algo más allá de mí en este momento. Además, realmente no tengo idea de cuán funcional puede obtener sin renunciar a DRY, terminar con un código difícil de mantener y/o enloquecer a los autores de plugin/script de terceros. –

+4

DRY es más fácil en lenguajes funcionales que OO ya que en FP es trivial refactorizar cualquier código repetido en una función que toma un parámetro. En OO (o más bien programación de procedimiento) código repetido es preámbulo y postamble que son lo mismo con un bit en el medio que es diferente que ha comenzado a pensar acerca de la clase base o interfaces, en FP no lo hace el bit en el medio se convierte una función como un parámetro. El libro de Tomás tiene excelentes ejemplos de esto: http://www.manning.com/petricek/ – Robert

Respuesta

5

Esto es un poco filosófico para tener una respuesta "correcta", pero está bien, voy a morder.

En mi opinión, el problema viene porque considera que FP y OO se yuxtaponen, no lo son. La FP y la programación imperativa se yuxtaponen, es decir, utilizando expresiones en lugar de utilizar instrucciones.

Parte del problema es que OO carece de una definición clara, bueno en mi opinión de todos modos. Para apoyar esto señalaría a Alan Kay, quien dijo: "De hecho, inventé el término" orientado a objetos ", y puedo decir que no tenía C++ en mente". Sin embargo, la mayoría del lenguaje lo consideramos OO, es decir, java/C# tomar más después de C++ que smalltalk.

Lo que el estilo OO C++/java/C# nos proporciona es una buena forma de organizar nuestro código en modelos, crear datos contiene agregarles propiedades, etc. No es prácticamente funcional y se puede usar con funcionalidad programación.

Como señala mucho C++/java/C# tienden a ser con estado, pero no tienen que serlo, tanto java como C# tienen tipos fundamentales como sus clases de cuerda que son inmutables. Es cierto que Java y C# no facilitan la creación de clases inmutables, pero con un poco de esfuerzo puedes hacerlo.

¿Qué nos lleva a dónde se apropia el inmutable? En mis diseños usualmente comienzo haciendo que todo sea inmutable, ya que esto hace que corregir las cosas sea más fácil, y si veo que esto causa problemas de rendimiento, empiezo a agregar cierta mutabilidad en las rutas críticas. La inmutabilidad de un solo lugar nunca va a funcionar son los controles de GUI, que generalmente contienen demasiado estado para ser inmutables. Una vez dicho esto, se puede obtener un camino bastante largo para construir GUI con un enfoque de "combinador" inmutable, y luego se interpreta mediante controles gui mutables. Esto es más o menos lo que hace el tipo de WebSharper: http://www.intellifactory.com/products/wsp/Home.aspx

Otro gran recurso para el debate FP/OO es el de Brain: "¿Cómo afecta la programación funcional la estructura de tu código?" (Lo cual influyó mucho en mi forma de pensar sobre FP/OO): http://lorgonblog.wordpress.com/2008/09/22/how-does-functional-programming-affect-the-structure-of-your-code/

+0

Gracias, el enfoque combinador podría ser lo que estoy buscando. La razón por la que puse FP en el otro extremo de OOP es porque, como señaló Rafe, OOP ofrece muchas características organizacionales que no son tan sencillas en FP (para mí, de todos modos, por eso lo pregunto). Además, cuando expongo el modelo de objetos a los autores de complementos, quiero asegurarme de que el consumidor no ponga el modelo en un estado no válido, lo que no estoy seguro es tan fácil de garantizar en los estilos que no son OO, incluido FP . También he leído la publicación de Brian en el pasado, pero la razón por la que vuelvo a preguntar es porque Brian sigue alentando a OO "en general". –

+0

Sí, estoy de acuerdo en que OO en general es algo bueno, pero la mayoría de los lenguajes de FP también tienen un buen conjunto de características de OO, que incluyen funciones que lo ayudan a organizar su código. Paso bastante tiempo programando con C# y F #, encuentro que C# está perdiendo características que me parecen útiles en F #, coincidencia de patrones, tipos de unión para tener solo un par, pero al revés no parece ser cierto. Creo que debat sería más útil si pudieras encontrar ejemplos más específicos de cosas fáciles en OO pero que no están disponibles en un langaue de FP. – Robert

+0

Hmm, bueno, nunca quise que fuera un debate, pero sí, por ejemplo, no puedo pensar en una forma obvia de enlazar datos a objetos inmutables. –

Cuestiones relacionadas