Sé que esta pregunta es un poco abierta, pero he estado mirando Scala / Lift como una alternativa a Java / Spring y me pregunto cuáles son las ventajas reales que Scala / Lift tiene sobre ella. Desde mi perspectiva y experiencia, Java Annotations y Spring realmente minimizan la cantidad de codificación que tiene que hacer para una aplicación. ¿Scala / Lift mejora eso?
151
Respuestas:
Supongamos que estamos igualmente cómodos en Scala y Java, e ignoramos las (enormes) diferencias de lenguaje, excepto en lo que respecta a Spring o Lift.
Spring y Lift son casi diametralmente opuestos en términos de madurez y objetivos.
En una oración, Spring es pesado y Lift es liviano. Con suficiente determinación y recursos puede darle la vuelta a eso, pero necesitaría mucho de ambos.
Aquí hay diferencias concretas que se quedaron en mi mente después de trabajar con ambos marcos. Esta no es una lista exhaustiva, que no puedo compilar de todos modos. Justo lo que me pareció más interesante ...
Ver filosofia
Lift fomenta la colocación de material de visualización en fragmentos / métodos de acción. El código de fragmento se espolvoreará especialmente con elementos de formulario generados mediante programación,
<div>
s,<p>
s, etc.Esto es poderoso y útil, especialmente porque Scala tiene un modo XML de nivel de lenguaje incorporado. Uno puede escribir XML en línea dentro de los métodos Scala, incluidos los enlaces variables entre llaves. Esto puede ser una delicia para servicios XML muy simples o maquetas de servicios: puede combinar un conjunto de acciones de respuesta HTTP, todo en un archivo espléndidamente conciso, sin plantillas o mucha configuración auxiliar. La desventaja es la complejidad. Dependiendo de qué tan lejos llegue, hay una separación difusa de preocupaciones entre la vista y la lógica, o no hay separación.
En contraste, el uso regular de Spring para webapps impone una fuerte separación entre la vista y todo lo demás. Creo que Spring admite varios motores de plantillas, pero solo he usado JSP en algo serio. Hacer un diseño "MVC difuso" inspirado en Lift con JSP sería una locura. Esto es algo bueno en proyectos más grandes, donde el tiempo para leer y comprender puede ser abrumador.
Opciones de mapeador relacional de objetos
El ORM integrado de Lift es "Mapper". Hay una próxima alternativa llamada "Record", pero creo que todavía se considera pre-alfa. El libro LiftWeb tiene secciones sobre el uso de Mapper y JPA.
La función CRUDify de Lift , por genial que sea, solo funciona con Mapper (y no con JPA).
Por supuesto, Spring admite una gran variedad de tecnologías de bases de datos estándar y / o maduras . La palabra operativa allí es "apoyos". Teóricamente, puede usar cualquier ORM de Java con Lift, ya que puede llamar a código arbitrario de Java desde Scala. Pero Lift solo es compatible con Mapper y (en mucho menor medida) JPA. Además, trabajar con código Java no trivial en Scala actualmente no es tan sencillo como uno quisiera; utilizando un ORM de Java, probablemente se encontrará utilizando colecciones de Java y Scala en todas partes o convirtiendo todas las colecciones dentro y fuera de los componentes de Java.
Configuración
Las aplicaciones de elevación se configuran prácticamente en su totalidad a través de un método de clase "Boot" para toda la aplicación. En otras palabras, la configuración se realiza a través del código Scala. Esto es perfecto para proyectos con configuraciones breves, y cuando la persona que realiza la configuración se siente cómoda editando Scala.
Spring es bastante flexible en términos de configuración. Muchas opciones conf se pueden manejar a través de la configuración XML o anotaciones.
Documentación
La documentación del ascensor es joven. Los documentos de Spring son bastante maduros. No hay concurso
Como los documentos de Spring ya están bien organizados y son fáciles de encontrar, revisaré los documentos que encontré para Lift. Básicamente, existen 4 fuentes de documentación de Lift: el libro de LiftWeb , los documentos API , el grupo de Google de LiftWeb y " Getting Started ". También hay un buen conjunto de ejemplos de código, pero no los llamaría "documentación" per se.
Los documentos API están incompletos. El libro LiftWeb ha sido publicado en árboles, pero también está disponible gratuitamente en línea. Es realmente útil, aunque su estilo decididamente didáctico me irritó a veces. Es un poco largo en tutorial y corto en contrato. Spring tiene un manual adecuado, que le falta a Lift.
Pero Lift tiene un buen conjunto de ejemplos. Si se siente cómodo leyendo el código Lift y el código de ejemplo (y ya conoce Scala bien), puede resolver las cosas en un tiempo bastante corto.
Ambos marcos son convincentes. Hay una amplia gama de aplicaciones donde puede elegir cualquiera y hacerlo bien.
fuente
Tengo que decir que estoy totalmente en desacuerdo con la respuesta de Dan LaRocque.
El ascensor no es monolítico. Se compone de elementos discretos. No ignora los elementos J / EE, admite JNDI, JTA, JPA, etc. El hecho de que no esté obligado a usar estos elementos de J / EE es una fuerte indicación del diseño modular de Lift.
Dicho lo anterior, permítanme hablar un poco sobre la filosofía de diseño de Lift.
Escribí Web Framework Manifesto antes de comenzar a escribir Lift. En gran medida, y en mayor medida de lo que es cierto para cualquier otro marco web que conozco, Lift cumple con estos objetivos.
Levantar en su núcleo busca abstraer el ciclo de solicitud / respuesta HTTP en lugar de colocar envoltorios de objetos alrededor de la solicitud HTTP. En el nivel práctico, esto significa que la mayoría de las acciones que puede realizar un usuario (enviar elementos de formulario, hacer Ajax, etc.) están representadas por un GUID en el navegador y una función en el servidor. Cuando el GUID se presenta como parte de una solicitud HTTP, la función se aplica (se llama) con los parámetros proporcionados. Debido a que los GUID son difíciles de predecir y específicos de la sesión, los ataques de repetición y muchos ataques de manipulación de parámetros son mucho más difíciles con Lift que la mayoría de los otros marcos web, incluido Spring. También significa que los desarrolladores son más productivos porque se están centrando en las acciones del usuario y la lógica de negocios asociada con las acciones del usuario en lugar de la plomería de empaquetar y desempaquetar una solicitud HTTP.
Es así de simple. Debido a que friendRequest está en el alcance cuando se crea la función, la función se cierra sobre el alcance ... no hay necesidad de exponer la clave principal de la solicitud de amistad o hacer otra cosa ... solo defina el texto del botón (se puede localizarse o puede extraerse de una plantilla XHTML o puede extraerse de una plantilla localizada) y la función para ejecutar cuando se presiona el botón. Lift se encarga de asignar el GUID, configurar la llamada Ajax (a través de jQuery o YUI, y sí, puede agregar su propia biblioteca de JavaScript favorita), hacer reintentos automáticos con retrasos, evitar el hambre de conexión haciendo cola las solicitudes de Ajax, etc.
Entonces, una gran diferencia entre Lift y Spring es que la filosofía de GUID de Lift asociada con la función tiene el doble beneficio de una seguridad mucho mejor y una productividad del desarrollador mucho mejor. El GUID -> La asociación de funciones ha demostrado ser muy duradera ... la misma construcción funciona para formas normales, ajax, cometa, asistentes de varias páginas, etc.
La siguiente pieza central de Lift es mantener las abstracciones de alto nivel durante el mayor tiempo posible. En el lado de la generación de páginas, eso significa construir la página como elementos XHTML y mantener la página como XHTML hasta justo antes de transmitir la respuesta. Los beneficios son la resistencia a los errores de secuencias de comandos en sitios cruzados, la capacidad de mover etiquetas CSS al encabezado y las secuencias de comandos al final de la página una vez que la página ha sido compuesta, y la capacidad de reescribir la página según el navegador de destino. En el lado de entrada, las URL se pueden volver a escribir para extraer parámetros (parámetros de consulta y ruta) de forma segura, los datos de alto nivel y de seguridad están disponibles para su procesamiento muy temprano en el ciclo de solicitud. Por ejemplo, aquí se explica cómo definir el servicio de una solicitud REST:
Usando la coincidencia de patrones incorporada de Scala, hacemos coincidir una solicitud entrante, extraemos la tercera parte de la ruta y obtenemos al Usuario que corresponde a ese valor, e incluso aplicamos controles de control de acceso (¿la sesión o solicitud actual tiene permisos para acceder a la determinada? Registro de usuario). Por lo tanto, cuando la instancia de usuario alcanza la lógica de la aplicación, se verifica.
Con estas dos piezas centrales, Lift tiene una tremenda ventaja en términos de seguridad. Para darle una idea de la magnitud de la seguridad de Lift que no se interpone en el camino de las características, Rasmus Lerdorg, que hizo seguridad para Yahoo! tenía esto que decir sobre FourSquare (uno de los sitios secundarios de póster de Lift):
En ese momento, FourSquare tenía un ingeniero trabajando en el código (no es que @harryh no sea un súper genio) y su enfoque principal era reescribir la versión PHP de FourSquare mientras se enfrentaba a la duplicación semanal del tráfico.
La última parte del enfoque de seguridad de Lift es SiteMap. Es un control de acceso unificado, navegación del sitio y sistema de menús. El desarrollador define las reglas de control de acceso para cada página usando el código Scala (p. Ej.
If(User.loggedIn _)
OIf(User.superUser _)
) y esas reglas de control de acceso se aplican antes de que comience cualquier representación de página. Esto es muy parecido a Spring Security, excepto que está integrado desde el comienzo del proyecto y las reglas de control de acceso están unificadas con el resto de la aplicación, por lo que no es necesario tener un proceso para actualizar las reglas de seguridad en XML cuando las URL cambio o los métodos que calculan el cambio de control de acceso.Para resumir hasta ahora, la filosofía de diseño de Lift le brinda los beneficios del control de acceso integrado, la resistencia a las 10 vulnerabilidades de seguridad de OWASP, un mejor soporte de Ajax y una productividad de desarrollador mucho mayor que Spring.
Pero Lift también le brinda el mejor soporte de Comet de cualquier marco web existente. Es por eso que Novell eligió Lift para impulsar su producto Pulse y esto es lo que Novell tiene que decir sobre Lift:
Entonces, Lift no es solo otro marco MVC de yo también. Es un marco que tiene algunos principios básicos de diseño que han madurado muy bien. Es un marco que ofrece las ventajas dobles de seguridad y productividad del desarrollador. Lift es un marco que está construido en capas y le da al desarrollador las opciones correctas en función de sus necesidades ... opciones para la generación de vistas, opciones para la persistencia, etc.
Scala y Lift ofrecen a los desarrolladores una experiencia mucho mejor que la mezcla de XML, anotaciones y otros modismos que componen Spring.
fuente
Te recomendaría que revises play framework, tiene algunas ideas muy interesantes y admite el desarrollo en Java y Scala
fuente
Solo por diversión. Y por el bien de aprender nuevos enfoques de programación.
fuente
Investigué mucho el uso de Lift para un proyecto web reciente, no ser un gran fanático de Spring MVC. No he usado las últimas versiones, pero las versiones anteriores de Spring MVC te hicieron saltar muchos obstáculos para ejecutar una aplicación web. Casi me vendieron en Lift hasta que vi que Lift puede depender mucho de la sesión y requeriría 'sesiones fijas' para funcionar correctamente. Extracto de http://exploring.liftweb.net/master/index-9.html#sec:Session-Management
Entonces, una vez que se requiere una sesión, el usuario tendría que estar conectado a ese nodo. Esto crea la necesidad de un equilibrio de carga inteligente y afecta el escalado, lo que evitó que Lift fuera una solución en mi caso. Terminé seleccionando http://www.playframework.org/ y estoy muy satisfecho. Jugar ha sido estable y confiable hasta ahora y es muy fácil trabajar con él.
fuente
Yo no vengo a Levante y Scala de un fondo de Java, así que esto no es por experiencia personal, pero sé que muchos desarrolladores de elevación encuentran Scala sea una forma mucho más concisa y eficiente que el lenguaje Java.
fuente
Ampliar su conocimiento siempre es un esfuerzo que vale la pena :) Acabo de comenzar a aprender Scala, está afectando la forma en que escribo Java normal y puedo decir que ha sido muy beneficioso hasta ahora.
fuente
Odio tirar completamente tu mundo por un bucle. Pero puede usar Scala, Java, Lift, Spring en una sola aplicación y que no sea un problema.
fuente
En mi humilde opinión, la imaginación es lo que importa.
Consideremos que quieres escribir una aplicación. Si eres un desarrollador decente, la aplicación ya debería estar construida en tu mente. El siguiente paso es descubrir cómo funciona a través del código. Para hacerlo, debe pasar la aplicación imaginada a través de una función que la traduce a una aplicación del mundo real. Esa función es un lenguaje de programación. Entonces
Entonces la elección del idioma es importante. Así es el marco. Hay un montón de personas inteligentes aquí que le aconsejarán sobre qué elegir, pero en última instancia, el idioma / marco que mejor traduzca su imaginación debería ser su elección. Así que prototipo con ambos y haz tu elección.
En cuanto a mí, poco a poco estoy aprendiendo Scala y Lift y me encanta.
fuente
Pero el problema principal es que no podemos comparar la primavera con la elevación. La elevación se usa básicamente como marco UI y Spring se usa como marco DI.
Si está desarrollando una aplicación web que tiene mucho backend, asegúrese de que puede usar lift.
pero si su aplicación web en desarrollo tiene algunas series de backend y definitivamente necesita ir a la primavera.
fuente