¿Por qué usaría Scala / Lift sobre Java / Spring? [cerrado]


151

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?


La pregunta es muy vieja. Pero ahora la pregunta sería "¿Por qué debería usar Scala / Play sobre XYX?" Y hay muchas buenas razones. Me mudé a Play y nunca miré hacia atrás.
Jus12

Respuestas:


113

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.

  • La primavera es aproximadamente cinco años mayor que Lift
  • La elevación es monolítica y se dirige solo a la web; Spring es modular y apunta a aplicaciones web y "regulares"
  • Spring admite una gran cantidad de funciones Java EE; Lift ignora esas cosas

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 ...

  1. 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.

  2. 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.

  3. 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.

  4. 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.


10
Sin embargo, una buena respuesta, un punto en el que no estoy de acuerdo es: Spring es un peso pesado. Tiene una amplia gama de buenos APIS e impone ciertas formas estructurales de trabajo necesarias para obtener un buen resultado, pero en comparación con el material J2EE que reemplazó originalmente, es una solución mucho más liviana. Por supuesto, la "ligereza" está en el ojo del espectador, por lo que este es definitivamente un argumento subjetivo. Solo mis 2 centavos entonces.
Brian

3
Buena respuesta, muy objetiva. Lift hace demasiadas cosas aparentemente inteligentes, que son muy estúpidas. Mover la lógica de la página al back-end, mezclar HTML con el código de escala, que es peor que las etiquetas de control dentro de la plantilla de la página. No sé por qué hicieron esto, tal vez piensan que Scala debe procesar XML increíblemente rápido. "La guía definitiva para levantar" es el peor libro de tecnología que he leído.
Sawyer

No estoy tan familiarizado con el ascensor como me gustaría estar. En su opinión, ¿qué tan difícil sería crear un contenedor para el objeto de arranque que en su lugar lea la configuración de un archivo xml? Mi primera impresión es que, dado que scala maneja xml tan bien fuera de la caja, no sería excepcionalmente difícil.
Ape-inago

Sawyer, el hecho de que puedes mezclar HTML con código scala no dice que tengas que hacerlo. El uso de fragmentos de manera inteligente separará el código HTML y el código Scala. Pero bueno, sigan usando sus etiquetas de control;)
Alebon

1
@Dan, ¿hay alguna actualización ahora que Lift tiene el doble de antigüedad que cuando escribiste esto por primera vez?
Pacerier

229

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.

  • La filosofía de visión de Lift es "dejar que el desarrollador decida". Lift ofrece un mecanismo de plantillas que no permite ningún código lógico en la vista, un mecanismo de vista basado en la ejecución del código Scala y los literales XML de Scala, y un mecanismo de vista basado en Scalate . Si elige el mecanismo de creación de plantillas XML, entonces elige la cantidad de marcado, si corresponde, en su lógica comercial. La separación de vistas de Lift es más fuerte que cualquier cosa que Spring tenga para ofrecer porque no puede expresar ninguna lógica de negocios en las plantillas XML de Lift.
  • El objetivo de Lift ↔ La filosofía de persistencia es "dejar que el desarrollador decida". Lift tiene Mapper, que es un mapeador relacional de objetos de estilo ActiveRecord. Hace el trabajo para pequeños proyectos. Soporte elevador JPA. Lift tiene una abstracción de registro que admite el traslado de objetos dentro y fuera de bases de datos relacionales, dentro y fuera de almacenes NoSQL (Lift incluye soporte nativo para CouchDB y MongoDB, pero las capas de adaptador son unos cientos de líneas de código, así que si quieres Cassandra o algo más, no es mucho trabajo conseguirlo.) Básicamente, Lift the Web Framework no depende de cómo se materializan los objetos en una sesión. Además, los ciclos de sesión y solicitud están abiertos de tal manera que insertar ganchos de transacción en el ciclo de solicitud / respuesta es simple.
  • La filosofía de Lift es "el equipo del servidor necesita saber un idioma, no varios idiomas". Esto significa que la configuración se realiza a través de Scala. Esto significa que no tuvimos que implementar el 40% de las construcciones de lenguaje Java en sintaxis XML para crear opciones de configuración flexibles. Significa que la sintaxis y el tipo del compilador verifican los datos de configuración para que no obtenga ningún análisis XML extraño o datos incorrectos en tiempo de ejecución. Esto significa que no tiene que tener IDE que comprendan los detalles de las anotaciones que está utilizando en función de la biblioteca que está utilizando.
  • Sí, la documentación de Lift no es su punto fuerte.

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.

ajaxButton("Accept", () => {request.accept.save; 
                            SetHtml("acceptrejectspan", <span/>}) ++ 
ajaxButton("Reject", () => {request.reject.save; 
                            SetHtml("acceptrejectspan", <span/>})

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:

  serve {
    case "api" :: "user" :: AsUser(user) :: _ XmlGet _ => <b>{user.name}</b>
    case "api" :: "user" :: AsUser(user) :: _ JsonGet _ => JStr(user.name)
  }

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):

Cuatro estrellas para @foursquare - 1er sitio en un tiempo he echado un buen vistazo a eso no tenía un solo problema de seguridad (que pude encontrar) - http://twitter.com/rasmus/status/5929904263

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 _)O If(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:

Lift es el tipo de marco web que le permite a usted como desarrollador concentrarse en el panorama general. La escritura fuerte y expresiva y las características de nivel superior, como el soporte Comet incorporado, le permiten concentrarse en innovar en lugar de en la plomería. La creación de una aplicación web rica y en tiempo real como Novell Pulse requiere un marco con el poder de Lift bajo las cubiertas.

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.


2
Una versión archivada de blog.lostlake.org/index.php?/archives/16-Web-Framework-Manifesto.html está disponible en replay.web.archive.org/20070220231839/http://blog.lostlake.org/…
Alan Hecht

1
Me tienes en el soporte nativo de MongoDB ... Estoy en
Eran Medan

8
He estado escribiendo webapps desde mediados de los 90. He usado Perl, Java, Seam, JSP y muchos otros. Todos los que conozco que usan Spring se quejan de la dificultad de hacer que las configuraciones y dependencias sean correctas, pesadillas de Maven, etc. Empecé a usar Lift en un proyecto hace unas semanas y estoy absolutamente asombrado. Es el primer marco (y lenguaje) que he usado donde las cosas funcionan casi sin esfuerzo. He escrito docenas de funciones en mi aplicación hasta ahora, y estoy continuamente asombrado de lo rápido que lo hago bien ... incluso con documentos extravagantes y una comprensión limitada de Scala. Ver es creer.
Tony K.

@TonyK .: seguramente Spring es pesado, pero valdrá la pena si la aplicación web se cambia mucho más tarde, ya que es mucho más fácil refactorizar / ampliar con Spring. En mi humilde opinión, depende. He usado algunos otros marcos, como Grails, en pequeños proyectos y creo que es perfecto para eso, pero para que algo cambie mucho más tarde, iría con Spring.
Hoàng Long

77
@ HoàngLong Hay muchos enfoques para la dificultad de la evolución del software. Simplemente estoy afirmando mi experiencia: Java está mostrando su edad como lenguaje, al igual que los marcos construidos sobre él. Es hora de evolucionar a cosas que son más expresivas y poderosas sin toda la locura y la locura de configuración.
Tony K.

11

Te recomendaría que revises play framework, tiene algunas ideas muy interesantes y admite el desarrollo en Java y Scala


2
Revisé Play. No vi nada excepto la recarga de clase incorporada para recomendarlo, y con la licencia gratuita de Scala JRebel, lo obtienes con Lift.
Tony K.

10

Solo por diversión. Y por el bien de aprender nuevos enfoques de programación.


10

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

Hasta que haya una tecnología de replicación de sesión estándar, aún puede agrupar su aplicación utilizando "sesión fija". Esto mide que todas las solicitudes pertenecientes a una sesión HTTP deben ser procesadas por el mismo nodo del clúster

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.


7

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.


3

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.


3

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.


0

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

Real app = programming language (imagined app)

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.


0

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.