Pourquoi utiliser Scala / Lift sur Java / Spring? [fermé]

151

Je sais que cette question est un peu ouverte, mais j'ai examiné Scala / Lift comme une alternative à Java / Spring et je me demande quels sont les avantages réels de Scala / Lift par rapport à cela. De mon point de vue et de mon expérience, Java Annotations and Spring minimise vraiment la quantité de codage que vous devez effectuer pour une application. Scala / Lift améliore-t-il cela?

Chris J
la source
La question est trop ancienne. Mais maintenant la question serait "Pourquoi devrais-je utiliser Scala / Play sur XYX" et il y a beaucoup de bonnes raisons. J'ai déménagé sur Play et je n'ai jamais regardé en arrière.
Jus12

Réponses:

113

Supposons que nous soyons également à l'aise avec Scala et Java, et ignorons les (énormes) différences de langage, sauf en ce qui concerne Spring ou Lift.

Spring et Lift sont presque diamétralement opposés en termes de maturité et d'objectifs.

  • Spring a environ cinq ans de plus que Lift
  • Lift est monolithique et ne cible que le Web; Spring est modulaire et cible à la fois les applications Web et «régulières»
  • Spring prend en charge une pléthore de fonctionnalités Java EE; Lift ignore ce truc

En une phrase, Spring est lourd et Lift est léger. Avec une détermination et des ressources suffisantes, vous pouvez renverser la situation, mais vous auriez besoin de beaucoup des deux.

Voici les différences concrètes qui me sont restées à l'esprit après avoir travaillé avec les deux frameworks. Ce n'est pas une liste exhaustive, que je ne peux pas compiler de toute façon. Juste ce qui me semblait le plus intéressant ...

  1. Voir la philosophie

    Lift encourage le placement de certains éléments de vue dans des méthodes d'extrait / action. Le code de l'extrait de code sera en particulier saupoudré d'éléments de formulaire générés par programme, <div>s, <p>s, etc.

    Ceci est puissant et utile, d'autant plus que Scala a un mode XML intégré au niveau du langage. On peut écrire du XML en ligne dans les méthodes Scala, y compris les liaisons de variables entre accolades. Cela peut être agréable pour des services XML très simples ou des maquettes de services - vous pouvez lancer une suite d'actions de réponse HTTP dans un seul fichier splendidement concis, sans modèles ni configuration supplémentaire. L'inconvénient est la complexité. Selon jusqu'où vous allez, il y a soit une séparation floue des préoccupations entre la vue et la logique, soit aucune séparation.

    En revanche, l'utilisation régulière de Spring pour les applications Web impose une forte séparation entre la vue et tout le reste. Je pense que Spring prend en charge plusieurs moteurs de création de modèles, mais je n'ai utilisé JSP que pour tout ce qui est sérieux. Faire un design "MVC flou" inspiré de Lift avec JSP serait de la folie. C'est une bonne chose sur les projets plus importants, où le temps de lire et de comprendre peut être accablant.

  2. Choix du mappeur objet-relationnel

    L'ORM intégré de Lift est "Mapper". Il y a une alternative à venir appelée "Record", mais je pense qu'elle est toujours considérée comme pré-alpha. Le LiftWeb Book contient des sections sur l'utilisation à la fois de Mapper et de JPA.

    La fonction CRUDify de Lift , aussi cool qu'elle soit, ne fonctionne qu'avec Mapper (et non JPA).

    Bien entendu, Spring prend en charge une panoplie de technologies de base de données standard et / ou matures . Le mot clé est "supports". Théoriquement, vous pouvez utiliser n'importe quel ORM Java avec Lift, car vous pouvez appeler du code Java arbitraire à partir de Scala. Mais Lift ne prend vraiment en charge que Mapper et (dans une bien moindre mesure) JPA. De plus, travailler avec du code Java non trivial dans Scala n'est actuellement pas aussi transparent qu'on pourrait le souhaiter; en utilisant un ORM Java, vous vous retrouverez probablement à utiliser les collections Java et Scala partout ou à convertir toutes les collections dans et hors des composants Java.

  3. Configuration

    Les applications Lift sont configurées à peu près entièrement via une méthode de classe «Boot» à l'échelle de l'application. En d'autres termes, la configuration se fait via le code Scala. C'est parfait pour les projets avec de brèves configurations, et lorsque la personne effectuant la configuration est à l'aise pour éditer Scala.

    Spring est assez flexible en termes de configuration. De nombreuses options de configuration peuvent être pilotées via une configuration XML ou des annotations.

  4. Documentation

    La documentation de Lift est jeune. Les documents de Spring sont assez mûrs. Il n'y a pas de concours.

    Étant donné que les documents de Spring sont déjà bien organisés et faciles à trouver, je vais passer en revue les documents que j'ai trouvés pour Lift. Il existe essentiellement 4 sources de documentation Lift: le LiftWeb Book , l' API Docs , le groupe Google LiftWeb et " Getting Started ". Il y a aussi une belle suite d'exemples de code, mais je ne les appellerais pas "documentation" en soi.

    Les documents de l'API sont incomplets. Le LiftWeb Book a été publié sur les arbres, mais il est également disponible gratuitement en ligne. C'est vraiment utile, même si son style résolument didactique m'a parfois irrité. C'est un peu long sur le tutoriel et court sur le contrat. Spring a un manuel approprié, ce qui manque à Lift.

    Mais Lift a un bel ensemble d'exemples. Si vous êtes à l'aise pour lire le code Lift et l'exemple de code (et que vous connaissez déjà bien Scala), vous pouvez régler les choses dans un délai assez court.

Les deux cadres sont convaincants. Il existe une large gamme d'applications dans lesquelles vous pouvez choisir l'une ou l'autre et bien faire.

Dan LaRocque
la source
10
Une bonne réponse, un point sur lequel je ne suis pas d'accord est: le printemps est un poids lourd. Il possède une large gamme de bons APIS et impose certaines méthodes de travail structurelles nécessaires pour obtenir un bon résultat, mais comparé aux éléments J2EE qu'il a remplacés à l'origine, c'est une solution beaucoup plus légère. Bien sûr, la «légèreté» est dans l'œil du spectateur, c'est donc certainement un argument subjectif. Juste mes 2 cents alors.
Brian
3
Bonne réponse, très objective. Lift fait trop de choses apparemment intelligentes, qui sont très stupides. Déplacer la logique de la page vers le backend, mélanger le HTML au code scala, ce qui est pire que les balises de contrôle à l'intérieur du modèle de page. Je ne sais pas pourquoi ils ont fait cela, peut-être pensent-ils que Scala doit traiter le XML incroyablement vite. "The Definitive Guide to Lift" est le pire livre technique que j'ai jamais lu.
Sawyer
Je ne suis pas aussi familier avec l'ascenseur que je le souhaiterais. À votre avis, à quel point serait-il difficile de créer un wrapper pour l'objet de démarrage qui lit les paramètres à partir d'un fichier xml? Ma première impression est que puisque scala gère si bien le xml dès sa sortie de la boîte, ce ne serait pas exceptionnellement difficile.
Ape-inago
Sawyer, le fait que vous puissiez mélanger du HTML au code scala ne signifie pas que vous devez le faire. L'utilisation d'extraits de code de manière intelligente séparera le code HTML et Scala. Mais bon, continuez à utiliser vos balises de contrôle;)
Alebon
1
@Dan, y a-t-il des mises à jour maintenant que Lift est deux fois plus vieux que lorsque vous avez écrit ceci pour la première fois?
Pacerier
229

Je dois dire que je ne suis pas du tout d'accord avec la réponse de Dan LaRocque.

L'ascenseur n'est pas monolithique. Il est composé d'éléments discrets. Il n'ignore pas les éléments J / EE, il prend en charge des éléments tels que JNDI, JTA, JPA, etc. Le fait que vous ne soyez pas obligé d'utiliser ces éléments de J / EE est une indication forte de la conception modulaire de Lift.

  • La philosophie de la vue de Lift est de «laisser le développeur décider». Lift propose un mécanisme de modèle qui n'autorise aucun code logique dans la vue, un mécanisme de vue basé sur l'exécution de code Scala et des littéraux XML de Scala, et un mécanisme de vue basé sur Scalate . Si vous choisissez le mécanisme de création de modèles XML, vous choisissez la part de balisage, le cas échéant, dans votre logique métier. La séparation des vues de Lift est plus forte que tout ce que Spring a à offrir, car vous ne pouvez exprimer aucune logique métier dans les modèles XML de Lift.
  • La philosophie de Lift's Object ↔ Persistence est de «laisser le développeur décider». Lift a Mapper qui est un mappeur relationnel d'objet de style ActiveRecord. Il fait le travail pour les petits projets. Support de levage JPA. Lift a une abstraction Record qui prend en charge la navette d'objets dans et hors des bases de données relationnelles, dans et hors des magasins NoSQL (Lift inclut la prise en charge native de CouchDB et MongoDB, mais les couches d'adaptateur sont quelques centaines de lignes de code, donc si vous voulez Cassandra ou autre chose, ce n'est pas beaucoup de travail pour l'obtenir.) Fondamentalement, Lift the Web Framework n'a aucune dépendance sur la façon dont les objets sont matérialisés dans une session. En outre, les cycles de session et de demande sont ouverts de sorte que l'insertion de hooks de transaction dans le cycle de demande / réponse est simple.
  • La philosophie de Lift est que "l'équipe serveur doit connaître une langue et non plusieurs langues". Cela signifie que la configuration se fait via Scala. Cela signifie que nous n'avons pas eu à implémenter 40% des constructions de langage Java dans la syntaxe XML pour créer des options de configuration flexibles. Cela signifie que la syntaxe du compilateur et le type vérifient les données de configuration afin que vous n'obteniez aucune analyse XML étrange ou des données incorrectes au moment de l'exécution. Cela signifie que vous n'avez pas besoin d'EDI qui comprennent les particularités des annotations que vous utilisez en fonction de la bibliothèque que vous utilisez.
  • Oui, la documentation de Lift n'est pas son point fort.

Cela dit, permettez-moi de parler de la philosophie de conception de Lift.

J'ai écrit le manifeste Web Framework avant de commencer à écrire Lift. Dans une large mesure, et dans une plus grande mesure que pour tout autre framework Web que je connaisse, Lift atteint ces objectifs.

Lift en son cœur cherche à abstraction du cycle de requête / réponse HTTP plutôt que de placer des wrappers d'objets autour de la requête HTTP. Au niveau pratique, cela signifie que la plupart des actions qu'un utilisateur peut entreprendre (soumission d'éléments de formulaire, exécution d'Ajax, etc.) sont représentées par un GUID dans le navigateur et une fonction sur le serveur. Lorsque le GUID est présenté dans le cadre d'une requête HTTP, la fonction est appliquée (appelée) avec les paramètres fournis. Comme les GUID sont difficiles à prévoir et spécifiques à la session, les attaques de relecture et de nombreuses attaques de falsification de paramètres sont beaucoup plus difficiles avec Lift que la plupart des autres frameworks Web, y compris Spring. Cela signifie également que les développeurs sont plus productifs car ils se concentrent sur les actions de l'utilisateur et la logique métier associée aux actions de l'utilisateur plutôt que sur la plomberie de l'emballage et du déballage d'une requête HTTP.

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

C'est si simple. Parce que le friendRequest est dans la portée lorsque la fonction est créée, la fonction se ferme sur la portée ... il n'est pas nécessaire d'exposer la clé primaire de la demande d'ami ou de faire autre chose ... définissez simplement le texte du bouton (il peut être localisé ou il peut être extrait d'un modèle XHTML ou il peut être extrait d'un modèle localisé) et la fonction à exécuter lorsque le bouton est enfoncé. Lift s'occupe d'attribuer le GUID, de configurer l'appel Ajax (via jQuery ou YUI, et oui, vous pouvez ajouter votre propre bibliothèque JavaScript préférée), de faire des tentatives automatiques avec des back-offs, d'éviter le manque de connexion en mettant en file d'attente les requêtes Ajax, etc.

Ainsi, une grande différence entre Lift et Spring est que la philosophie de Lift du GUID associé à la fonction présente le double avantage d'une sécurité bien meilleure et d'une bien meilleure productivité des développeurs. L'association GUID -> Function s'est avérée très durable ... la même construction fonctionne pour les formes normales, ajax, comète, assistants multi-pages, etc.

La prochaine pièce maîtresse de Lift consiste à conserver les abstractions de haut niveau le plus longtemps possible. Du côté de la génération de page, cela signifie construire la page en tant qu'éléments XHTML et conserver la page au format XHTML juste avant de diffuser la réponse. Les avantages sont la résistance aux erreurs de script intersite, la possibilité de déplacer les balises CSS vers l'en-tête et les scripts vers le bas de la page après la composition de la page, et la possibilité de réécrire la page en fonction du navigateur cible. Du côté de l'entrée, les URL peuvent être réécrites pour extraire les paramètres (à la fois les paramètres de requête et de chemin) de manière sécurisée. Par exemple, voici comment définir le service d'une requête REST:

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

En utilisant la correspondance de modèle intégrée de Scala, nous faisons correspondre une demande entrante, extrayons la troisième partie du chemin et obtenons l'utilisateur qui correspond à cette valeur, et même appliquons des vérifications de contrôle d'accès (la session ou la demande en cours a-t-elle les autorisations pour accéder à Fiche utilisateur). Ainsi, au moment où l'instance User atteint la logique de l'application, elle est vérifiée.

Avec ces deux pièces maîtresses, Lift a un énorme avantage en termes de sécurité. Pour vous donner une idée de l'ampleur de la sécurité de Lift qui ne gêne pas les fonctionnalités, Rasmus Lerdorg qui a fait de la sécurité pour Yahoo! avait ceci à dire à propos de FourSquare (l'un des sites poster-enfants Lift):

Quatre étoiles à @foursquare - 1er site depuis un moment, j'ai bien regardé qui n'avait pas un seul problème de sécurité (que j'ai pu trouver) - http://twitter.com/rasmus/status/5929904263

À l'époque, FourSquare avait un ingénieur travaillant sur le code (non pas que @harryh ne soit pas un super-génie) et son objectif principal était de réécrire la version PHP de FourSquare tout en faisant face au doublement du trafic hebdomadaire.

La dernière partie de la stratégie de sécurité de Lift est SiteMap. Il s'agit d'un système de contrôle d'accès, de navigation sur le site et de menu unifié. Le développeur définit les règles de contrôle d'accès pour chaque page à l'aide du code Scala (par exemple If(User.loggedIn _)ou If(User.superUser _)) et ces règles de contrôle d'accès sont appliquées avant le début de tout rendu de page. Cela ressemble beaucoup à Spring Security, sauf qu'il est intégré dès le début du projet et que les règles de contrôle d'accès sont unifiées avec le reste de l'application, vous n'avez donc pas besoin de processus de mise à jour des règles de sécurité en XML lorsque les URL change ou les méthodes qui calculent le changement de contrôle d'accès.

Pour résumer jusqu'à présent, la philosophie de conception de Lift vous offre les avantages du contrôle d'accès intégré, la résistance aux 10 principales vulnérabilités de sécurité de l'OWASP, une bien meilleure prise en charge d'Ajax et une productivité des développeurs beaucoup plus élevée que Spring.

Mais Lift vous offre également le meilleur support Comet de tous les frameworks Web. C'est pourquoi Novell a choisi Lift pour alimenter son produit Pulse et voici ce que Novell a à dire à propos de Lift:

Lift est le type de framework Web qui vous permet en tant que développeur de vous concentrer sur une vue d'ensemble. Une frappe forte et expressive et des fonctionnalités de niveau supérieur telles que la prise en charge Comet intégrée vous permettent de vous concentrer sur l'innovation plutôt que sur la plomberie. La création d'une application Web riche en temps réel telle que Novell Pulse nécessite un cadre doté de la puissance de Lift sous les couvertures.

Donc, Lift n'est pas juste un autre framework MVC me-too. C'est un cadre qui repose sur des principes de conception fondamentaux qui ont très bien mûri. C'est un framework qui offre le double avantage de la sécurité et de la productivité des développeurs. Lift est un framework qui est construit en couches et donne au développeur les bons choix en fonction de ses besoins ... des choix pour la génération de vues, des choix pour la persistance, etc.

Scala et Lift offrent aux développeurs une bien meilleure expérience que le mélange de XML, d'annotations et d'autres expressions idiomatiques qui composent Spring.

David Pollak
la source
2
Une version archivée de blog.lostlake.org/index.php?/archives/16-Web-Framework-Manifesto.html est disponible sur replay.web.archive.org/20070220231839/http://blog.lostlake.org/...
Alan Hecht
1
Vous m'avez eu au support natif de MongoDB ... Je suis dans
Eran Medan
8
J'écris des applications Web depuis le milieu des années 90. J'ai utilisé Perl, Java, Seam, JSP et un grand nombre d'autres. Tous ceux que je connais qui utilisent Spring se plaignent de la difficulté à obtenir les bonnes configurations et dépendances, des cauchemars maven, etc. J'ai commencé à utiliser Lift sur un projet il y a quelques semaines et je suis absolument étonné. C'est le tout premier framework (et langage) que j'ai utilisé où les choses fonctionnent presque sans effort. Jusqu'à présent, j'ai écrit des dizaines de fonctionnalités dans mon application et je suis continuellement étonné de la rapidité avec laquelle je fais les choses correctement ... même avec des documents nuls et une compréhension limitée de Scala. Voir c'est croire.
Tony K.
@TonyK.: Spring est sûrement lourd, mais il sera payant si l'application Web est modifiée beaucoup plus tard, car il est beaucoup plus facile de refactoriser / étendre avec Spring. IMHO, cela dépend. J'ai utilisé d'autres frameworks, comme Grails, sur de petits projets et je pense que c'est parfait pour ça - mais pour quelque chose qui changera beaucoup plus tard, j'irais avec Spring.
Hoàng Long
7
@ HoàngLong Il existe de nombreuses approches de la difficulté de l'évolution des logiciels. Je dis simplement mon expérience: Java montre son âge en tant que langage, tout comme les frameworks construits dessus. Il est temps d'évoluer vers des choses plus expressives et plus puissantes sans toute la folie passe-partout et de configuration.
Tony K.
11

Je vous recommande de vérifier le framework de jeu, il a des idées très intéressantes et prend en charge le développement en Java et Scala

IPC
la source
2
J'ai vérifié Play. Je n'ai rien vu à part le rechargement de classe intégré pour le recommander, et avec la licence gratuite Scala JRebel, vous obtenez cela avec Lift.
Tony K.
10

Juste pour le fun. Et pour apprendre de nouvelles approches de programmation.

romain
la source
10

J'ai fortement envisagé d'utiliser Lift pour un projet Web récent, n'étant pas un grand fan de Spring MVC. Je n'ai pas utilisé les dernières versions, mais les versions antérieures de Spring MVC vous ont fait sauter à travers de nombreux obstacles pour faire fonctionner une application Web. J'étais presque vendu sur Lift jusqu'à ce que je voie que Lift peut être très dépendant de la session et nécessiterait des `` sessions collantes '' pour fonctionner correctement. Extrait de http://exploring.liftweb.net/master/index-9.html#sec:Session-Management

Jusqu'à ce qu'il y ait une technologie de réplication de session standard, vous pouvez toujours mettre en cluster votre application en utilisant la «session permanente». Cela signifie que toutes les demandes relatives à une session HTTP doivent être traitées par le même nœud de cluster

Ainsi, une fois qu'une session est requise, l'utilisateur devra être épinglé sur ce nœud. Cela crée le besoin d'un équilibrage de charge intelligent et affecte la mise à l'échelle, ce qui a empêché Lift d'être une solution dans mon cas. J'ai fini par sélectionner http://www.playframework.org/ et j'ai été très heureux. Le jeu a été stable et fiable jusqu'à présent et très facile à utiliser.

mguymon
la source
7

Je ne suis pas venu à Lift et Scala à partir d'un fond Java, donc ce n'est pas par expérience personnelle, mais je sais que de nombreux développeurs Lift trouvent que Scala est un langage beaucoup plus concis et efficace que Java.

pr1001
la source
3

Élargir vos connaissances est toujours une entreprise qui en vaut la peine :) Je viens de commencer à apprendre Scala, cela affecte la façon dont j'écris Java normal et je peux dire que cela a été très bénéfique jusqu'à présent.

gpampara
la source
3

Je déteste jeter complètement votre monde pour une boucle. Mais vous pouvez utiliser Scala, Java, Lift, Spring dans une seule application et que ce ne soit pas un problème.

Brun de Berlin
la source
0

À mon humble avis, l'imagination est ce qui compte.

Considérons que vous souhaitez écrire une application. Si vous êtes un développeur décent, l'application devrait déjà être créée dans votre esprit. L'étape suivante consiste à découvrir comment cela fonctionne grâce au code. Pour ce faire, vous devez transmettre l'application imaginée à une fonction qui la traduit en une application du monde réel. Cette fonction est un langage de programmation. Alors

Real app = programming language (imagined app)

Le choix de la langue est donc important. Le cadre aussi. Il y a une tonne de personnes intelligentes ici qui vous conseilleront sur ce qu'il faut choisir, mais en fin de compte, le langage / le cadre qui traduit le mieux votre imagination devrait être votre choix. Alors prototypez avec les deux et faites votre choix.

Quant à moi, j'apprends lentement Scala et Lift et j'adore ça.

Matei Alexandru Bogdan
la source
0

Mais le problème principal est que nous ne pouvons pas comparer le ressort à la portance. Lift est essentiellement utilisé comme cadre d'interface utilisateur et Spring est utilisé comme cadre DI.
Si vous développez une application Web qui a autant de backend, vous pouvez utiliser Lift.
mais si votre application Web en développement a un backend série et que vous devez absolument aller au printemps.

Rajith Delantha
la source