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?
151
Réponses:
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.
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 ...
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.
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.
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.
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.
la source
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.
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.
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:
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):
À 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 _)
ouIf(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:
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.
la source
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
la source
Juste pour le fun. Et pour apprendre de nouvelles approches de programmation.
la source
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
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.
la source
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.
la source
É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.
la source
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.
la source
À 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
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.
la source
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.
la source