Perché dovrei usare Scala / Lift su Java / Spring? [chiuso]


151

So che questa domanda è un po 'aperta, ma ho considerato Scala / Lift come un'alternativa a Java / Spring e mi chiedo quali siano i reali vantaggi che Scala / Lift ha su di essa. Dal mio punto di vista ed esperienza, Java Annotations e Spring minimizza davvero la quantità di codifica che devi fare per un'applicazione. Scala / Lift migliora?


La domanda è troppo vecchia. Ma ora la domanda sarebbe "Perché dovrei usare Scala / Play su XYX" e ci sono molte buone ragioni. Mi sono trasferito su Play e non ho mai guardato indietro.
Jus12,

Risposte:


113

Supponiamo che ci sentiamo ugualmente a nostro agio in Scala e Java, e ignoriamo le (enormi) differenze linguistiche, tranne per quanto riguarda Spring o Lift.

Spring e Lift sono quasi diametralmente opposti in termini di maturità e obiettivi.

  • La primavera ha circa cinque anni più di Lift
  • Lift è monolitico e prende di mira solo il web; La primavera è modulare e si rivolge sia al web che alle app "regolari"
  • Spring supporta numerose funzionalità Java EE; Lift ignora quella roba

In una frase, la primavera è pesante e Lift è leggero. Con sufficiente determinazione e risorse puoi capovolgerlo, ma ti serviranno molte di entrambe.

Qui ci sono differenze concrete che mi sono rimaste impresse dopo aver lavorato con entrambi i framework. Questa non è una lista esaustiva, che comunque non posso compilare. Proprio quello che mi è sembrato più interessante ...

  1. Vedi la filosofia

    Lift incoraggia a collocare materiale di visualizzazione in snippet / metodi di azione. In particolare, il codice dello snippet verrà cosparso di elementi di modulo generati a livello di codice, <div>s, <p>s, ecc

    Questo è potente e utile, soprattutto perché Scala ha una modalità XML a livello di linguaggio integrata. Si possono scrivere XML in linea con i metodi Scala, inclusi i collegamenti variabili tra parentesi graffe. Questo può essere delizioso per servizi XML molto semplici o mockup di servizi: puoi sbattere una serie di azioni di risposta HTTP tutte in un file splendidamente conciso, senza modelli o molta configurazione degli operatori. L'aspetto negativo è la complessità. A seconda di quanto vai lontano, c'è una separazione sfocata di preoccupazioni tra vista e logica, o nessuna separazione.

    Al contrario, l'uso regolare di Spring per le webapp impone una forte separazione tra la vista e tutto il resto. Penso che Spring supporti diversi motori di template, ma ho usato JSP solo in qualcosa di serio. Realizzare un design "fuzzy MVC" ispirato a Lift con JSP sarebbe una follia. Questa è una buona cosa su progetti più grandi, in cui il tempo di leggere e capire può essere travolgente.

  2. Scelte del mapping degli oggetti relazionali

    L'ORM incorporato di Lift è "Mapper". C'è una prossima alternativa chiamata "Record", ma penso che sia ancora considerata pre-alfa. Il libro LiftWeb contiene sezioni sull'uso sia di Mapper che di JPA.

    La funzione CRUDify di Lift , per quanto bella, funziona solo con Mapper (e non con JPA).

    Naturalmente, Spring supporta una vasta gamma di tecnologie di database standard e / o mature . La parola chiave è "supporti". Teoricamente, puoi usare qualsiasi ORM Java con Lift, dato che puoi chiamare un codice Java arbitrario da Scala. Ma Lift supporta davvero solo Mapper e (in misura molto minore) JPA. Inoltre, lavorare con codice Java non banale in Scala non è attualmente così fluido come si potrebbe desiderare; usando un ORM Java, probabilmente ti ritroverai ad utilizzare sia le raccolte Java che Scala ovunque o convertire tutte le raccolte dentro e fuori dai componenti Java.

  3. Configurazione

    Le app Lift sono configurate praticamente interamente attraverso un metodo una classe "Boot" a livello di applicazione. In altre parole, la configurazione viene eseguita tramite il codice Scala. Questo è perfetto per i progetti con brevi configurazioni e quando la persona che esegue la configurazione è a proprio agio nel modificare Scala.

    La primavera è piuttosto flessibile in termini di configurazione. Molte opzioni di configurazione possono essere guidate tramite la configurazione XML o le annotazioni.

  4. Documentazione

    La documentazione di Lift è giovane. I documenti di Spring sono piuttosto maturi. Non c'è contest.

    Poiché i documenti di Spring sono già ben organizzati e facili da trovare, esaminerò i documenti che ho trovato per Lift. Esistono essenzialmente 4 fonti di documentazione di Lift: LiftWeb Book , API Docs , il gruppo Google di LiftWeb e " Guida introduttiva ". C'è anche una bella suite di esempi di codice, ma non li definirei "documentazione" di per sé.

    I documenti API sono incompleti. Il libro LiftWeb è stato pubblicato sugli alberi, ma è anche disponibile gratuitamente online. È davvero utile, anche se a volte il suo stile decisamente didattico mi ha irritato. È un po 'lungo in tutorial e corto in contratto. La primavera ha un manuale adeguato, che manca all'ascensore.

    Ma Lift ha una bella serie di esempi. Se hai dimestichezza con la lettura del codice Lift e del codice di esempio (e conosci già Scala bene), puoi risolvere le cose in un ordine abbastanza breve.

Entrambi i framework sono convincenti. C'è una vasta gamma di app in cui puoi scegliere e fare bene.


10
Una buona risposta, un punto su cui non sarei d'accordo è: la primavera è un peso massimo. Ha una vasta gamma di buoni APIS e impone alcuni modi strutturali di lavoro necessari per ottenere un buon risultato, ma rispetto alle cose J2EE che ha originariamente sostituito è una soluzione molto più leggera. Naturalmente la "leggerezza" è negli occhi di chi guarda, quindi questo è sicuramente un argomento soggettivo. Solo i miei 2 centesimi allora.
Brian,

3
Buona risposta, molto obiettivo. Lift fa troppe cose apparentemente intelligenti, che sono molto stupide. Spostamento della logica della pagina nel backend, mescolando HTML al codice scala, che è peggio dei tag di controllo all'interno del modello di pagina. Non so perché l'hanno fatto, forse pensano che Scala debba elaborare l'XML in modo sorprendentemente veloce. "The Definitive guide to Lift" è il peggior libro tecnico che abbia mai letto.
Sawyer,

Non ho familiarità con l'ascensore come vorrei essere. Secondo te quanto sarebbe difficile creare un wrapper per l'oggetto di avvio che legge invece le impostazioni da un file XML? La mia prima impressione è che dato che scala gestisce xml così bene fuori dalla scatola, non sarebbe eccezionalmente difficile.
Ape-inago,

Sawyer, il fatto che tu possa mescolare HTML con il codice scala non dice che devi farlo. L'uso degli snippet in modo intelligente separerà HTML e codice Scala. Ma hey, continua a usare i tuoi tag di controllo;)
Alebon

1
@Dan, ci sono aggiornamenti ora che Lift ha il doppio rispetto a quando l'hai scritto per la prima volta?
Pacerier,

229

Devo dire che non sono assolutamente d'accordo con la risposta di Dan LaRocque.

L'ascensore non è monolitico. È composto da elementi discreti. Non ignora gli elementi J / EE, supporta elementi simili a JNDI, JTA, JPA, ecc. Il fatto che non sei obbligato a utilizzare questi elementi di J / EE è una forte indicazione del design modulare di Lift.

  • La filosofia di Lift è "lascia decidere allo sviluppatore". Lift offre un meccanismo di template che non consente alcun codice logico nella vista, un meccanismo di visualizzazione basato sull'esecuzione del codice Scala e sui letterali XML di Scala e un meccanismo di visualizzazione basato su Scalate . Se scegli il meccanismo di template XML, allora scegli quanto mark-up appartiene alla tua logica aziendale. La separazione della vista di Lift è più forte di qualsiasi cosa Spring abbia da offrire perché non è possibile esprimere alcuna logica aziendale nei modelli XML di Lift.
  • La filosofia di Lift ↔ Object Persistenza è "lascia decidere allo sviluppatore". Lift ha Mapper che è un mappatore relazionale di oggetti in stile ActiveRecord. Fa il lavoro per piccoli progetti. Sollevare il supporto JPA. Lift ha un'astrazione Record che supporta il trasferimento di oggetti dentro e fuori dai database relazionali, dentro e fuori dai negozi NoSQL (Lift include il supporto nativo per CouchDB e MongoDB, ma i livelli dell'adattatore sono poche centinaia di righe di codice, quindi se vuoi Cassandra o qualcos'altro, non c'è molto lavoro per ottenerlo.) Fondamentalmente, Lift the Web Framework non dipende da come gli oggetti si materializzano in una sessione. Inoltre, i cicli di sessione e richiesta sono aperti in modo tale che l'inserimento di hook di transazione nel ciclo richiesta / risposta sia semplice.
  • La filosofia di Lift è "il team del server deve conoscere una lingua, non più lingue". Ciò significa che la configurazione viene eseguita tramite Scala. Ciò significa che non abbiamo dovuto implementare il 40% dei costrutti del linguaggio Java nella sintassi XML per creare opzioni di configurazione flessibili. Significa che la sintassi del compilatore e il tipo controllano i dati di configurazione in modo da non ottenere strani analisi XML o dati errati in fase di esecuzione. Significa che non devi avere IDE in grado di comprendere i dettagli delle annotazioni che stai utilizzando in base alla libreria che stai utilizzando.
  • Sì, la documentazione di Lift non è il suo punto di forza.

Detto questo, lasciatemi parlare della filosofia di design di Lift.

Ho scritto Web Framework Manifesto prima di iniziare a scrivere Lift. In larga misura, e in misura maggiore di quanto sia vero per qualsiasi altro framework web di cui io sia a conoscenza, Lift raggiunge questi obiettivi.

Lift al suo interno cerca di sottrarre il ciclo di richiesta / risposta HTTP anziché posizionare involucri di oggetti attorno alla richiesta HTTP. A livello pratico, ciò significa che la maggior parte delle azioni che un utente può intraprendere (invio di elementi del modulo, esecuzione di Ajax, ecc.) È rappresentata da un GUID nel browser e da una funzione sul server. Quando il GUID viene presentato come parte di una richiesta HTTP, la funzione viene applicata (chiamata) con i parametri forniti. Poiché i GUID sono difficili da prevedere e specifici della sessione, gli attacchi di riproduzione e molti attacchi di manomissione dei parametri sono molto più difficili con Lift rispetto alla maggior parte degli altri framework Web, incluso Spring. Significa anche che gli sviluppatori sono più produttivi perché si stanno concentrando sulle azioni dell'utente e sulla logica aziendale associata alle azioni dell'utente piuttosto che sull'impianto idraulico di impacchettare e decomprimere una richiesta HTTP.

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

È così semplice. Poiché friendRequest è nell'ambito quando viene creata la funzione, la funzione si chiude sull'ambito ... non è necessario esporre la chiave primaria della richiesta di amicizia o fare qualsiasi altra cosa ... basta definire il testo del pulsante (esso può essere localizzato o può essere estratto da un modello XHTML o può essere estratto da un modello localizzato) e la funzione da eseguire quando si preme il pulsante. Lift si occupa di assegnare il GUID, impostare la chiamata Ajax (tramite jQuery o YUI, e sì, puoi aggiungere la tua libreria JavaScript preferita), fare tentativi automatici con back-off, evitare la fame di connessione accodando le richieste Ajax, ecc.

Quindi, una grande differenza tra Lift e Spring è che la filosofia di Lift del GUID associata alla funzione ha il duplice vantaggio di una sicurezza molto migliore e una produttività degli sviluppatori molto migliore. Il GUID -> L'associazione delle funzioni si è dimostrato molto durevole ... lo stesso costrutto funziona per forme normali, ajax, comete, maghi multipagina, ecc.

Il prossimo pezzo centrale di Lift sta mantenendo le astrazioni di alto livello il più a lungo possibile. Sul lato della generazione della pagina, ciò significa costruire la pagina come elementi XHTML e mantenere la pagina come XHTML fino a poco prima dello streaming della risposta. I vantaggi sono la resistenza agli errori di cross-site scripting, la possibilità di spostare i tag CSS in testa e gli script in fondo alla pagina dopo che la pagina è stata composta e la possibilità di riscrivere la pagina in base al browser di destinazione. Dal lato dell'input, gli URL possono essere riscritti per estrarre i parametri (sia i parametri di query che quelli di percorso) in modo sicuro, ad alto livello, i dati di sicurezza controllati sono disponibili per l'elaborazione molto presto nel ciclo di richiesta. Ad esempio, ecco come definire la manutenzione di una richiesta REST:

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

Usando il pattern matching integrato di Scala, abbiniamo una richiesta in arrivo, estraiamo la terza parte del percorso e otteniamo l'Utente che corrisponde a quel valore e persino applichiamo i controlli di controllo dell'accesso (la sessione o la richiesta corrente dispone delle autorizzazioni per accedere al dato Record dell'utente). Quindi, quando l'istanza utente raggiunge la logica dell'applicazione, viene verificata.

Con questi due pezzi fondamentali, Lift ha un enorme vantaggio in termini di sicurezza. Per darti un'idea della grandezza della sicurezza di Lift che non interferisce con le funzionalità, Rasmus Lerdorg che ha fatto sicurezza per Yahoo! ho detto questo su FourSquare (uno dei siti poster per bambini di Lift):

Quattro stelle su @foursquare - 1 ° sito da un po 'di tempo che ho visto bene che non aveva un singolo problema di sicurezza (che potevo trovare) - http://twitter.com/rasmus/status/5929904263

All'epoca, FourSquare aveva un ingegnere che lavorava sul codice (non che @harryh non fosse un super-genio) e il suo obiettivo principale era riscrivere la versione PHP di FourSquare mentre gestiva il raddoppio del traffico settimanale.

L'ultima parte del focus sulla sicurezza di Lift è SiteMap. È un controllo di accesso unificato, navigazione del sito e sistema di menu. Lo sviluppatore definisce le regole di controllo degli accessi per ogni pagina usando il codice Scala (es. If(User.loggedIn _)O If(User.superUser _)) e tali regole di controllo degli accessi vengono applicate prima che inizi il rendering della pagina. Questo è molto simile a Spring Security, tranne per il fatto che è inserito dall'inizio del progetto e che le regole di controllo dell'accesso sono unificate con il resto dell'applicazione, quindi non è necessario disporre di un processo per l'aggiornamento delle regole di sicurezza in XML quando gli URL modifica o i metodi che calcolano la modifica del controllo di accesso.

Riassumendo fino ad ora, la filosofia di progettazione di Lift offre i vantaggi offerti dal controllo degli accessi, dalla resistenza alle 10 principali vulnerabilità di sicurezza di OWASP, un supporto Ajax molto migliore e una produttività degli sviluppatori molto più elevata rispetto a Spring.

Ma Lift offre anche il miglior supporto Comet per qualsiasi framework web in circolazione. Ecco perché Novell ha scelto Lift per alimentare il suo prodotto Pulse ed ecco cosa ha da dire Novell su Lift:

Lift è il tipo di framework Web che ti consente come sviluppatore di concentrarti sul quadro generale. Digitazione forte ed espressiva e funzionalità di livello superiore come il supporto Comet integrato consentono di concentrarsi sull'innovazione anziché sull'impianto idraulico. La creazione di un'applicazione Web ricca e in tempo reale come Novell Pulse richiede un framework con la potenza di Lift sotto le coperte.

Quindi, Lift non è solo un altro framework MVC anch'io. È un framework che ha alcuni principi di progettazione fondamentali che sono maturati molto bene. È un framework che offre i doppi vantaggi di sicurezza e produttività degli sviluppatori. Lift è un framework costruito a strati e offre allo sviluppatore le giuste scelte in base alle sue esigenze ... scelte per la generazione di visualizzazioni, scelte per la persistenza, ecc

Scala e Lift offrono agli sviluppatori un'esperienza molto migliore rispetto al melange di XML, annotazioni e altri modi di dire che compongono Spring.


2
Una versione archiviata di blog.lostlake.org/index.php?/archives/16-Web-Framework-Manifesto.html è disponibile su replay.web.archive.org/20070220231839/http://blog.lostlake.org/…
Alan Hecht,

1
Mi avevi al supporto nativo MongoDB ... Sono dentro
Eran Medan,

8
Scrivo webapp dalla metà degli anni '90. Ho usato Perl, Java, Seam, JSP e molti altri. Tutti quelli che conosco, che usano la primavera, si lamentano della difficoltà di sistemare le configurazioni e le dipendenze, gli incubi della fucina, ecc. Ho iniziato a usare Lift su un progetto qualche settimana fa e sono assolutamente stupito. È il primissimo framework (e linguaggio) che ho usato dove le cose funzionano quasi senza sforzo. Finora ho scritto dozzine di funzioni nella mia app e sono continuamente sorpreso dalla rapidità con cui riesco a farlo ... anche con documenti sucky e una comprensione limitata di Scala. Vedere per credere.
Tony K.,

@TonyK .: sicuramente la primavera è pesante, ma pagherà se l'app web viene cambiata molto più tardi, dal momento che è molto più facile eseguire il refactoring / estensione con Spring. IMHO, dipende. Ho usato alcuni altri framework, come Grails, su piccoli progetti e penso che sia perfetto per questo - ma per qualcosa cambierà molto più tardi, andrei con Spring.
Hoàng Long

7
@ HoàngLong Ci sono molti approcci alla difficoltà dell'evoluzione del software. Sto semplicemente affermando la mia esperienza: Java sta mostrando la sua età come linguaggio, così come i framework costruiti su di essa. È tempo di evolversi in cose che sono più espressive e potenti senza tutta la follia della placca e della configurazione.
Tony K.,

11

Ti consiglierei di controllare il framework di gioco, ha alcune idee molto interessanti e supporta lo sviluppo in Java e Scala


2
Ho controllato Play. Non ho visto nulla, tranne la ricarica della classe integrata per consigliarlo, e con la licenza Scala JRebel gratuita, lo ottieni con Lift.
Tony K.,

10

Solo per divertimento. E per imparare nuovi approcci di programmazione.


10

Ho fortemente esaminato l'utilizzo di Lift per un recente progetto Web, non essendo un grande fan di Spring MVC. Non ho usato le ultime versioni, ma le versioni precedenti di Spring MVC ti hanno fatto saltare attraverso molti cerchi per far funzionare un'applicazione web. Sono stato quasi venduto su Lift fino a quando non ho visto che Lift può dipendere molto dalla sessione e richiederebbe "sessioni appiccicose" per funzionare correttamente. Estratto da http://exploring.liftweb.net/master/index-9.html#sec:Session-Management

Fino a quando non esiste una tecnologia di replica delle sessioni standard, è comunque possibile raggruppare l'applicazione utilizzando la "sessione adesiva". Questo misura che tutte le richieste relative a una sessione HTTP devono essere elaborate dallo stesso nodo del cluster

Quindi, una volta richiesta una sessione, l'utente dovrebbe essere aggiunto a quel nodo. Ciò crea la necessità di un bilanciamento del carico intelligente e influisce sul ridimensionamento, il che ha impedito a Lift di essere una soluzione nel mio caso. Ho finito per selezionare http://www.playframework.org/ e sono rimasto molto soddisfatto. Il gioco è stato finora stabile e affidabile e molto facile da lavorare.


7

Io non vengo a Sollevare e Scala da un background di Java, quindi questo non è per esperienza personale, ma so che molti sviluppatori di sollevamento trovano Scala per essere un molto più conciso e il linguaggio efficiente di Java.


3

Espandere le tue conoscenze è sempre uno sforzo utile :) Ho appena iniziato a studiare Scala, sta influenzando il modo in cui scrivo Java normale e posso dire che finora è stato molto utile.


3

Odio gettare completamente il tuo mondo per un giro. Ma puoi usare Scala, Java, Lift, Spring in un'applicazione e non avere problemi.


0

Secondo la mia modesta opinione, l'immaginazione è ciò che conta.

Pensiamo che tu voglia scrivere un'app. Se sei uno sviluppatore decente, l'app dovrebbe già essere costruita nella tua mente. Il prossimo passo è scoprire come funziona attraverso il codice. Per fare ciò, è necessario passare l'app immaginata attraverso una funzione che la traduca in un'app del mondo reale. Questa funzione è un linguaggio di programmazione. Così

Real app = programming language (imagined app)

Quindi la scelta della lingua è importante. Così è il quadro. Ci sono un sacco di persone intelligenti qui che ti consiglieranno su cosa scegliere, ma alla fine, il linguaggio / quadro che traduce meglio la tua immaginazione dovrebbe essere la tua scelta. Quindi prototipo con entrambi e fai la tua scelta.

Per quanto mi riguarda, sto lentamente imparando Scala e Lift e lo adoro.


0

Ma il problema principale è che non possiamo confrontare la molla con l'ascensore. L'ascensore è fondamentalmente utilizzato come framework UI e Spring è usato come framework DI.
Se stai sviluppando un'app Web che ha un sacco di backend, puoi usare lift.
ma se la tua app web in via di sviluppo ha un backend di serie e sicuramente devi andare a primavera.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.