lunes, 7 de julio de 2008

Primer proyecto Scala y ¡sin Dependency Injection!

Use el ORM estándar de Java (JPA), el framework web LiftWeb de Scala, pero de DI... nada de nada.

Es un poco normal, porque es solamente la maqueta del proyecto y no amerita usar todavia el "señor de los framework", el que los ata a todos. No obstante, no me hizo falta ni un segundo, incluso para crear un Entity Manager por HTTP Request, donde en Java, me acostumbre usar Guice y Warp-Persist. Para cubrir esta necesidad, LiftWeb vino al rescate, junto con una buena documentación (ver el capitulo Per Session Entity Manager).

Ahora que entre en la segunda fase del proyecto, con la maqueta aprobada, voy a tener que manejar más transacciones y es una oportunidad para usar algo como la anotación @Transaction de Warp-Persist sobre Guice. Así que busque un framework de DI para Scala o como integrar con uno de Java. Y, o sorpresa, encontre que no son tan necesarios porque el lenguaje provee mecanismos que los hacen menos relevantes.

Primero lei esta entrada del artista del DSL y luego las referencias: una conversación en un foro y este documento del creador de Scala. Finalmente, leí de nuevo el comentario del "Loco Bob" (no es un chilenismo, es la traducción literal de "Crazy Bob", el autor de Guice): en la página home de su framework:

You might think of Guice as filling in missing features for core Java. Ideally, the language itself would provide most of the same features, but until such a language comes along, we have Guice.

¿Será tan bueno Scala, que puedo decir adiós a los framework de DI? Ojala que si.

4 comentarios:

Jorge.Rodriguez.Suarez dijo...

Francois:

No deberiamos tender a lenguajes de programación más sencillos y expresivos ?.

La primera impresión al mirar Scala es agregar a Java la programación Funcional usando sintáxis nueva.

DSL?: lenguajes como Ruby permiten implementar DSL de forma sencilla a través de su metaprogramming.

Dada la siguiente tabla:

Scala:
- OOP
- Funcional
- Static
- Extensible
- Portable
- Minimalistic (uso de librerias)
- DSL (si)

Ruby:
- OOP
- Funcional
- Dinamic
- Extensible
- Portable
- Human Interface
- DSL (metaprogramming)

Python:
- OOP
- Funcional
- Dinamic
- Extensible
- Portable
- Minimalistic (muchas librerias)
- DSL (si mediante Generators)

Que justifica el uso de Scala?,

Solo se me ocurre el re-uso de la gran cantidad de librerias Java, pero en el caso de Python tambien goza de muchas librerias y el caso de Ruby aun mejor con su actitud "Human Interface" de escribir sus clases.

De cualquier forma, felicidades, debes ser el primero en Chile en usar Scala ! y las cosas primero se hacen y despues se critican :)

Francois dijo...

Jorge:

Voy a necesitar varias entradas para responder a este comentario.

Y lo más probable que voy a responder en parte, porque no tengo suficiente experiencia practica con Ruby y Python para emitir una opinión inteligente.

Para responder rapido, no estoy de acuerdo contigo que Scala no es sencillo y expresivo. En algunos sitios que visite antes de aprender este lenguaje, comparan el LOC (Lineas de Codigo) de programas hechos en Scala vs Ruby: y son casi iguales (busca "scala ruby compare" en Google).

Tampoco estoy de acuerdo que Scala es igual a Java + programación funcional. Es cierto que Scala comparte conceptos con Java (como la orientación al objeto) pero la sintaxis es distinta. De hecho, no puedes tomar un programa java, renombrar su fuente a .scala y compilarlo con scalac. Es lo mismo que hizo Sun con C y C++: no trataron de mantener compatibilidad, lo que les permitio hacer un diseño más limpio.

Germán dijo...

Llegué aquí un poco tarde, pero quisiera agregar una respuesta a Jorge. Scala sí es expresivo, y en principio también diría que es sencillo aunque eso puede depender de la profundidad que se pretenda. Por ejemplo puede tener su complejidad armar una librería bien diseñada y lo suficientemente genérica, pero no tanto utilizarla.
Por otra parte, Scala también puede estar justificado frente a Ruby/Python considerando que la JVM es una excelente plataforma, y que en muchos casos podemos depender de software legacy sobre la misma que con Scala podemos seguir aprovechando. La performance, casi igual que la de Java, es una ventaja frente a lenguajes interpretados.
Desde un punto de vista menos pragmático, la integración OO-Funcional es más profunda y da lugar a interesantes posibilidades. Yo todavía lo estoy explorando, seguramente habría más para decir.
Saludos

Francois dijo...

@Germán:

100% de acuerdo con los tres argumentos que pusiste.

Hay un buen articulo de Bill Wenners relacionado con tu primer argumento: es fácil usar API's hechas en Scala porque se entiende rápidamente lo que pretenden hacer. Pero, no es tan fácil entender como funcionan por dentro.

http://www.artima.com/weblogs/viewpost.jsp?thread=252702


Tu segundo argumento es mi caballo de batalla en este blog. No me canso mencionar la importancia de re-utilizar la JVM y las API's de Java. Sin esta capacidad, no habría terminado mis proyectos o mis clientes no me habrían dejado ponerlos en producción.


Finalmente, estoy de acuerdo que la fusión OO-funcional es muy interesante. Los lenguajes funcionales están de vuelta porque se requiere un cambio de paradigma para enfrentar la crisis del multi-core.