Ich weiß, dass diese Frage etwas offen ist, aber ich habe Scala / Lift als Alternative zu Java / Spring betrachtet und mich gefragt, was die wirklichen Vorteile von Scala / Lift gegenüber Scala / Lift sind. Aus meiner Sicht und Erfahrung minimieren Java Annotations und Spring den Codierungsaufwand für eine Anwendung erheblich. Verbessert Scala / Lift das?
151
Antworten:
Nehmen wir an, wir fühlen uns in Scala und Java gleichermaßen wohl und ignorieren die (großen) Sprachunterschiede, außer in Bezug auf Spring oder Lift.
Frühling und Lift sind in Bezug auf Reife und Ziele fast diametral entgegengesetzt.
In einem Satz ist Spring schwer und Lift leicht. Mit ausreichender Entschlossenheit und Ressourcen können Sie das auf den Kopf stellen, aber Sie würden viel von beidem brauchen .
Hier sind konkrete Unterschiede, die mir nach der Arbeit mit beiden Frameworks in den Sinn gekommen sind. Dies ist keine vollständige Liste, die ich sowieso nicht zusammenstellen kann. Genau das, was mir am interessantesten erschien ...
Philosophie anzeigen
Lift empfiehlt das Platzieren von Ansichtsmaterial in Snippet- / Aktionsmethoden. Insbesondere Snippet-Code wird mit programmgesteuert generierten Formularelementen,
<div>
s,<p>
s usw. bestreut .Dies ist leistungsstark und nützlich, insbesondere da Scala über einen integrierten XML-Modus auf Sprachebene verfügt. Innerhalb von Scala-Methoden kann XML inline geschrieben werden, einschließlich variabler Bindungen in geschweiften Klammern. Dies kann für sehr einfache XML-Dienste oder Modelle von Diensten von Vorteil sein. Sie können eine Reihe von HTTP-Antwortaktionen in einer prächtig knappen Datei ohne Vorlagen oder viel zugehörige Konfiguration ausführen. Der Nachteil ist die Komplexität. Je nachdem, wie weit Sie gehen, gibt es entweder eine unscharfe Trennung von Bedenken zwischen Ansicht und Logik oder keine Trennung.
Im Gegensatz dazu erzwingt die regelmäßige Verwendung von Spring für Webanwendungen eine starke Trennung zwischen der Ansicht und allem anderen. Ich denke, Spring unterstützt mehrere Template-Engines, aber ich habe JSP nur in ernsthaften Situationen verwendet. Ein von Lift inspiriertes "Fuzzy MVC" -Design mit JSP zu machen, wäre Wahnsinn. Dies ist eine gute Sache bei größeren Projekten, bei denen die Zeit zum Lesen und Verstehen überwältigend sein kann.
Objektrelationale Mapper-Auswahlmöglichkeiten
Das eingebaute ORM von Lift ist "Mapper". Es gibt eine bevorstehende Alternative namens "Record", aber ich denke, sie wird immer noch als Pre-Alpha betrachtet. Das LiftWeb-Buch enthält Abschnitte zur Verwendung von Mapper und JPA.
Die coole CRUDify- Funktion von Lift funktioniert nur mit Mapper (und nicht mit JPA).
Natürlich unterstützt Spring eine Vielzahl von Standard- und / oder ausgereiften Datenbanktechnologien . Das operative Wort dort ist "unterstützt". Theoretisch können Sie mit Lift jedes Java-ORM verwenden, da Sie von Scala aus beliebigen Java-Code aufrufen können. Aber Lift unterstützt nur Mapper und (in viel geringerem Maße) JPA wirklich. Außerdem ist die Arbeit mit nicht trivialem Java-Code in Scala derzeit nicht so nahtlos, wie man es gerne hätte. Wenn Sie ein Java-ORM verwenden, werden Sie wahrscheinlich entweder überall Java- und Scala-Sammlungen verwenden oder alle Sammlungen in und aus den Java-Komponenten konvertieren.
Aufbau
Lift-Apps werden so gut wie vollständig mithilfe einer anwendungsweiten "Boot" -Klasse konfiguriert. Mit anderen Worten, die Konfiguration erfolgt über Scala-Code. Dies ist perfekt für Projekte mit kurzen Konfigurationen und wenn die Person, die die Konfiguration vornimmt, mit der Bearbeitung von Scala vertraut ist.
Der Frühling ist in Bezug auf die Konfiguration ziemlich flexibel. Viele conf-Optionen können entweder durch XML-Konfiguration oder durch Anmerkungen gesteuert werden.
Dokumentation
Die Dokumentation von Lift ist jung. Die Dokumente von Spring sind ziemlich ausgereift. Es gibt keinen Wettbewerb.
Da die Dokumente von Spring bereits gut organisiert und leicht zu finden sind, werde ich die Dokumente überprüfen, die ich für Lift gefunden habe. Grundsätzlich gibt es 4 Quellen für die Lift-Dokumentation: das LiftWeb-Buch , die API- Dokumente, die Google-Gruppe von LiftWeb und " Erste Schritte ". Es gibt auch eine schöne Reihe von Codebeispielen, aber ich würde sie nicht per se "Dokumentation" nennen.
Die API-Dokumente sind unvollständig. Das LiftWeb-Buch wurde auf Bäumen veröffentlicht, ist aber auch online frei verfügbar. Es ist wirklich nützlich, obwohl mich sein entschieden didaktischer Stil manchmal irritierte. Das Tutorial ist etwas lang und der Vertrag kurz. Spring hat ein richtiges Handbuch, das Lift fehlt.
Aber Lift hat einige schöne Beispiele. Wenn Sie den Lift-Code und den Beispielcode gut lesen können (und Scala bereits gut kennen), können Sie die Dinge in relativ kurzer Zeit erledigen.
Beide Frameworks überzeugen. Es gibt eine breite Palette von Apps, bei denen Sie entweder auswählen und gut abschneiden können.
quelle
Ich muss sagen, dass ich der Antwort von Dan LaRocque überhaupt nicht zustimme.
Der Aufzug ist nicht monolithisch. Es besteht aus diskreten Elementen. J / EE-Elemente werden nicht ignoriert, es werden beispielsweise JNDI, JTA, JPA usw. unterstützt. Die Tatsache, dass Sie nicht gezwungen sind, diese Elemente von J / EE zu verwenden, ist ein starkes Indiz für den modularen Aufbau von Lift.
Lassen Sie mich vor diesem Hintergrund etwas über die Designphilosophie von Lift sprechen.
Ich habe Web Framework Manifesto geschrieben, bevor ich anfing, Lift zu schreiben. Lift erfüllt diese Ziele in hohem Maße und in größerem Maße als bei jedem anderen mir bekannten Webframework.
Im Kern versucht Lift, den HTTP-Anforderungs- / Antwortzyklus zu abstrahieren, anstatt Objekt-Wrapper um die HTTP-Anforderung zu platzieren. Auf praktischer Ebene bedeutet dies, dass die meisten Aktionen, die ein Benutzer ausführen kann (Senden von Formularelementen, Ausführen von Ajax usw.), durch eine GUID im Browser und eine Funktion auf dem Server dargestellt werden. Wenn die GUID als Teil einer HTTP-Anforderung angezeigt wird, wird die Funktion mit den angegebenen Parametern angewendet (aufgerufen). Da die GUIDs schwer vorherzusagen und sitzungsspezifisch sind, sind Wiederholungsangriffe und viele Parametermanipulationsangriffe mit Lift weitaus schwieriger als die meisten anderen Webframeworks, einschließlich Spring. Dies bedeutet auch, dass Entwickler produktiver sind, da sie sich auf Benutzeraktionen und die mit Benutzeraktionen verbundene Geschäftslogik konzentrieren und nicht auf das Installieren und Entpacken einer HTTP-Anforderung.
So einfach ist das. Da sich die friendRequest beim Erstellen der Funktion im Bereich befindet, wird die Funktion über dem Bereich geschlossen. Es ist nicht erforderlich, den Primärschlüssel der Freundschaftsanforderung verfügbar zu machen oder etwas anderes zu tun. Definieren Sie einfach den Text der Schaltfläche (it kann lokalisiert werden oder es kann aus einer XHTML-Vorlage gezogen werden oder es kann aus einer lokalisierten Vorlage gezogen werden) und die Funktion, die ausgeführt werden soll, wenn die Taste gedrückt wird. Lift kümmert sich um das Zuweisen der GUID, das Einrichten des Ajax-Aufrufs (über jQuery oder YUI, und ja, Sie können Ihre eigene bevorzugte JavaScript-Bibliothek hinzufügen), das automatische Wiederholen mit Back-Offs, das Vermeiden von Verbindungsmangel durch das Einreihen von Ajax-Anforderungen usw.
Ein großer Unterschied zwischen Lift und Spring besteht darin, dass die mit der Funktion verbundene GUID-Philosophie von Lift den doppelten Vorteil einer viel besseren Sicherheit und einer viel besseren Entwicklerproduktivität bietet. Die GUID -> Funktionszuordnung hat sich als sehr dauerhaft erwiesen. Das gleiche Konstrukt funktioniert für normale Formen, Ajax, Kometen, mehrseitige Assistenten usw.
Das nächste Kernstück von Lift besteht darin, die Abstraktionen auf hoher Ebene so lange wie möglich beizubehalten. Auf der Seite der Seitengenerierung bedeutet dies, dass die Seite als XHTML-Elemente erstellt und bis kurz vor dem Streaming der Antwort als XHTML beibehalten wird. Die Vorteile sind die Beständigkeit gegen Cross-Site-Scripting-Fehler, die Möglichkeit, CSS-Tags in den Kopf und Skripte an den unteren Rand der Seite zu verschieben, nachdem die Seite erstellt wurde, und die Möglichkeit, die Seite basierend auf dem Zielbrowser neu zu schreiben. Auf der Eingabeseite können URLs neu geschrieben werden, um Parameter (sowohl Abfrage- als auch Pfadparameter) typsicher zu extrahieren. Hochwertige, sicherheitsgeprüfte Daten können sehr früh im Anforderungszyklus verarbeitet werden. So definieren Sie beispielsweise die Wartung einer REST-Anforderung:
Mithilfe des in Scala integrierten Mustervergleichs stimmen wir eine eingehende Anforderung ab, extrahieren den dritten Teil des Pfads und ermitteln den Benutzer, der diesem Wert entspricht, und wenden sogar Zugriffssteuerungsprüfungen an (verfügt die aktuelle Sitzung oder Anforderung über Berechtigungen für den Zugriff auf die angegebene Anforderung? Benutzerdatensatz). Wenn die Benutzerinstanz die Anwendungslogik erreicht, wird sie überprüft.
Mit diesen beiden Kernstücken hat Lift einen enormen Sicherheitsvorteil. Um Ihnen eine Vorstellung von der Größe der Sicherheit von Lift zu geben, die den Funktionen nicht im Wege steht, hat Rasmus Lerdorg, der die Sicherheit für Yahoo! hatte folgendes über FourSquare (eine der Lift-Poster-Child-Sites) zu sagen:
Zu dieser Zeit hatte FourSquare einen Ingenieur, der an dem Code arbeitete (nicht, dass @harryh kein Supergenie ist), und sein Hauptaugenmerk lag darauf, die PHP-Version von FourSquare neu zu schreiben, während er mit der wöchentlichen Verdoppelung des Datenverkehrs fertig wurde.
Der letzte Teil des Sicherheitsfokus von Lift ist SiteMap. Es ist eine einheitliche Zugriffskontrolle, Site-Navigation und ein Menüsystem. Der Entwickler definiert die Zugriffssteuerungsregeln für jede Seite mithilfe von Scala-Code (z. B.
If(User.loggedIn _)
oderIf(User.superUser _)
). Diese Zugriffssteuerungsregeln werden angewendet, bevor mit dem Rendern einer Seite begonnen wird. Dies ähnelt Spring Security, mit der Ausnahme, dass es vom Beginn des Projekts an eingebunden ist und die Zugriffssteuerungsregeln mit dem Rest der Anwendung vereinheitlicht werden, sodass Sie keinen Prozess zum Aktualisieren der Sicherheitsregeln in XML benötigen, wenn die URLs verwendet werden Änderung oder die Methoden, die die Zugriffssteuerung berechnen, ändern sich.Zusammenfassend lässt sich sagen, dass die Designphilosophie von Lift Ihnen die Vorteile einer integrierten Zugriffskontrolle, Widerstand gegen die Top-10-Sicherheitslücken von OWASP, eine viel bessere Ajax-Unterstützung und eine viel höhere Entwicklerproduktivität als Spring bietet.
Lift bietet Ihnen aber auch die beste Comet-Unterstützung für jedes Webframework. Aus diesem Grund hat sich Novell für Lift entschieden, um sein Pulse-Produkt mit Strom zu versorgen. Novell sagt Folgendes zu Lift:
Lift ist also nicht nur ein weiteres MVC-Framework für mich. Es ist ein Framework, das einige grundlegende Designprinzipien enthält, die sehr gut ausgereift sind. Es ist ein Framework, das die doppelten Vorteile von Sicherheit und Entwicklerproduktivität bietet. Lift ist ein Framework, das in Ebenen aufgebaut ist und dem Entwickler die richtigen Auswahlmöglichkeiten basierend auf seinen Anforderungen bietet ... Auswahlmöglichkeiten für die Ansichtsgenerierung, Auswahlmöglichkeiten für die Persistenz usw.
Scala und Lift bieten Entwicklern eine viel bessere Erfahrung als die Mischung aus XML, Anmerkungen und anderen Redewendungen, aus denen Spring besteht.
quelle
Ich würde Ihnen empfehlen, das Play Framework zu überprüfen. Es enthält einige sehr interessante Ideen und unterstützt die Entwicklung in Java und Scala
quelle
Nur zum Spaß. Und um neue Programmieransätze zu erlernen.
quelle
Ich habe mich intensiv mit der Verwendung von Lift für ein aktuelles Webprojekt befasst und war kein großer Fan von Spring MVC. Ich habe nicht die neuesten Versionen verwendet, aber die früheren Versionen von Spring MVC haben Sie dazu gebracht, durch viele Rahmen zu springen, um eine Webanwendung zum Laufen zu bringen. Ich war fast mit Lift verkauft, bis ich sah, dass Lift sehr sitzungsabhängig sein kann und "Sticky Sessions" erfordern würde, um richtig zu funktionieren. Auszug aus http://exploring.liftweb.net/master/index-9.html#sec:Session-Management
Sobald eine Sitzung erforderlich ist, muss der Benutzer an diesen Knoten gebunden sein. Dies schafft die Notwendigkeit eines intelligenten Lastausgleichs und wirkt sich auf die Skalierung aus, wodurch verhindert wurde, dass Lift in meinem Fall eine Lösung darstellt. Am Ende habe ich http://www.playframework.org/ ausgewählt und war sehr zufrieden. Das Spiel war bisher stabil und zuverlässig und es war sehr einfach, damit zu arbeiten.
quelle
Ich bin nicht aus Java zu Lift und Scala gekommen, daher ist dies keine persönliche Erfahrung, aber ich weiß, dass viele Lift-Entwickler Scala als eine viel präzisere und effizientere Sprache als Java betrachten.
quelle
Das Erweitern Ihres Wissens ist immer ein lohnendes Unterfangen :) Ich habe gerade angefangen, Scala zu lernen. Es beeinflusst, wie ich normales Java schreibe, und ich kann sagen, dass es bisher sehr nützlich war.
quelle
Ich hasse es, deine Welt komplett für eine Schleife zu werfen. Aber Sie können Scala, Java, Lift, Spring in einer Anwendung verwenden und es ist kein Problem.
quelle
Meiner bescheidenen Meinung nach kommt es auf die Vorstellungskraft an.
Angenommen, Sie möchten eine App schreiben. Wenn Sie ein anständiger Entwickler sind, sollte die App bereits in Ihrem Kopf erstellt werden. Der nächste Schritt besteht darin, herauszufinden, wie es durch Code funktioniert. Dazu müssen Sie die imaginäre App durch eine Funktion führen, die sie in eine reale App übersetzt. Diese Funktion ist eine Programmiersprache. So
Die Wahl der Sprache ist also wichtig. So ist der Rahmen. Es gibt hier eine Menge kluger Leute, die Sie beraten, was Sie wählen sollen, aber letztendlich sollte die Sprache / der Rahmen, der Ihre Vorstellungskraft am besten übersetzt, Ihre Wahl sein. Also Prototyp mit beiden und treffen Sie Ihre Wahl.
Ich lerne langsam Scala und Lift und liebe es.
quelle
Das Hauptproblem ist jedoch, dass wir die Feder nicht mit dem Auftrieb vergleichen können. Lift wird grundsätzlich als UI-Framework und Spring als DI-Framework verwendet.
Wenn Sie eine Web-App entwickeln, die über so viel Backend verfügt, können Sie Lift verwenden.
Aber wenn Ihre sich entwickelnde Web-App ein Serien-Backend hat und Sie definitiv zum Frühling müssen.
quelle