Dlaczego miałbym używać Scala / Lift over Java / Spring? [zamknięte]

Wiem, że to pytanie jest trochę otwarte, ale patrzyłem na Scala / Lift jako alternatywę dla Java / Spring i zastanawiam się, jakie są realne zalety, jakie ma Scala/Lift w stosunku do niego. Z mojego punktu widzenia i doświadczenia, adnotacje Java i Spring naprawdę minimalizują ilość kodowania, które trzeba zrobić dla aplikacji. Czy Scala / Lift się na tym poprawia?

Author: Ivan, 2010-04-21

10 answers

Załóżmy, że jesteśmy równie komfortowi w Scali i Javie, i zignorujmy (ogromne) różnice językowe, z wyjątkiem sytuacji, gdy dotyczą one Springa lub lifta.

Spring i Lift są niemal diametralnie przeciwne pod względem dojrzałości i celów.
  • wiosna jest o pięć lat starsza od Lift
  • Lift jest monolityczny i celuje tylko w sieć; Spring jest modułowy i celuje zarówno w sieć, jak i w "zwykłe" aplikacje.]}
  • Spring obsługuje mnóstwo funkcji Java EE; Lift ignoruje that stuff

W zdaniu, sprężyna jest ciężka, a Wyciąg lekka. Z wystarczającą determinacją i zasobami możesz to obrócić na głowę, ale potrzebujesz partii obu.

Oto konkretne różnice, które utkwiły mi w głowie po pracy z obydwoma frameworkami. To nie jest wyczerpująca lista, której i tak nie mogę skompilować. To, co wydawało mi się najciekawsze...

  1. Zobacz filozofię

    / Align = "left" / wyświetlanie materiału w metodach urywek/akcja. Urywek kodu będzie szczególnie posypany programowo generowanymi elementami formularza, <div> s, <p> s, itp.

    Jest to potężne i użyteczne, zwłaszcza, że Scala ma wbudowany tryb XML na poziomie języka. W metodach Scala można zapisywać XML inline, włączając w to wiązania zmiennych w nawiasach klamrowych. Może to być zachwycające dla bardzo prostych usług XML lub makiet usług - możesz wybić zestaw akcji odpowiedzi HTTP w jednym plik, bez szablonów i dużej konfiguracji. Minusem jest złożoność. W zależności od tego, jak daleko zajdziesz, istnieje rozmyta separacja obaw między poglądem a logiką lub brak separacji.

    W przeciwieństwie do tego, regularne stosowanie sprężyny dla webapps wymusza silną separację między widokiem i wszystkim innym. Myślę, że Spring obsługuje kilka silników szablonowych, ale używałem tylko JSP w czymś poważnym. Wykonanie inspirowanego windą projektu "fuzzy MVC" z JSP byłoby szaleństwem. Jest to dobra rzecz w przypadku większych projektów, w których czas na przeczytanie i zrozumienie może być przytłaczający.

  2. Object-Relational Mapper Choices

    / Align= "left" / Jest nadchodząca alternatywa o nazwie "Record" , ale myślę, że nadal jest uważana za pre-alpha. Książka LiftWeb zawiera sekcje dotyczące korzystania zarówno z Mapera, jak i JPA.

    Funkcja Lift ' s CRUDify , choć fajna, działa tylko z mapperem (a nie JPA).

    Oczywiście, podpory sprężynowe A panoply standardowych i / lub dojrzałych technologii baz danych . Słowo kluczowe to "podpory". Teoretycznie można użyć dowolnego Java ORM z Lift, ponieważ można wywołać dowolny kod Java ze Scali. Ale Lift tylko naprawdę obsługuje Mapper i (w znacznie mniejszym stopniu) JPA. Ponadto praca z nietrywialnym kodem Javy w Scali nie jest obecnie tak bezproblemowa, jak by się chciało; używając Java ORM, prawdopodobnie znajdziesz się zarówno w kolekcjach Java, jak i Scala wszędzie lub konwertowanie wszystkich kolekcji w komponentach Java i poza nimi.

  3. Konfiguracja

    Aplikacje Lift są konfigurowane prawie całkowicie za pomocą metody klasy "Boot" dla całej aplikacji. Innymi słowy, konfiguracja odbywa się za pomocą kodu Scala. Jest to idealne rozwiązanie dla projektów z krótkimi konfiguracjami, a gdy osoba dokonująca konfiguracji jest wygodna w edycji Scali.

    Sprężyna jest dość elastyczna pod względem konfiguracji. Wiele opcji conf może być napędzane albo poprzez konfigurację XML lub adnotacje.
  4. Dokumentacja

    Dokumentacja Lift ' A jest młoda. Doktorzy springa są dość Dojrzali. Nie ma żadnej konkurencji.

    Ponieważ dokumenty Springa są już dobrze zorganizowane i łatwe do znalezienia, przejrzę dokumenty, które znalazłem dla windy. Istnieją cztery źródła dokumentacji Liftweb: Liftweb Book, API Docs, Liftweb ' S Google group oraz "Getting Started". Jest też miły zestaw przykładów kodu, ale nie nazwałbym ich "dokumentacją" per se.

    Dokumenty API są niekompletne. Książka "LiftWeb" została wydana na drzewach, ale jest również dostępna bezpłatnie w Internecie. Jest naprawdę przydatny, choć jego zdecydowanie dydaktyczny styl czasami mnie irytował. Jest trochę długa na samouczku i krótka na kontrakcie. Sprężyna ma odpowiednią ręczną, której windy brakuje.

    Ale Lift ma niezły zestaw przykładów. Jeśli wygodnie czytasz Kod windy i przykład kod (i dobrze znasz Scalę), możesz wszystko rozpracować w dość krótkim czasie.

Oba frameworki są przekonujące. Istnieje szeroka gama aplikacji, w których możesz wybrać albo i zrobić dobrze.

 112
Author: Dan LaRocque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-24 01:22:42

Muszę powiedzieć, że zdecydowanie nie zgadzam się z odpowiedzią dana LaRocque ' a.

/ Align = "left" / Składa się na elementy dyskretne. Nie ignoruje elementów J / EE, obsługuje m.in. JNDI, JTA, JPA itp. Fakt, że nie jesteś zmuszony do korzystania z tych elementów J/EE jest silnym wskaźnikiem modułowej konstrukcji Lift.
    Filozofia Lift 'a brzmi:" Niech deweloper zdecyduje."Lift oferuje mechanizm szablonów, który nie pozwala na żaden kod logiczny w widoku, a mechanizm widoku oparty na wykonywaniu kodu Scali i literałów XML Scali oraz mechanizm widoku oparty na Scalate. Jeśli wybierzesz mechanizm szablonów XML, to wybierzesz, ile, jeśli w ogóle, znaczników należy do Twojej logiki biznesowej. Separacja widoku Lift jest silniejsza niż cokolwiek, co Spring ma do zaoferowania, ponieważ nie można wyrazić żadnej logiki biznesowej w szablonach XML Lift.
  • Lift 's Object ↔ Persistence philosophy is" let the developer decide."Lift ma Mapper, który jest ActiveRecord style object relational mapper. Robi to zadanie dla małych projektów. Obsługa podnoszenia JPA. Lift ma abstrakcję rekordów, która obsługuje przenoszenie obiektów do i z relacyjnych baz danych, do i z magazynów NoSQL (Lift zawiera natywne wsparcie dla CouchDB i MongoDB, ale warstwy adaptera to kilkaset linii kodu, więc jeśli chcesz Cassandrę lub coś innego, nie ma dużo pracy, aby go zdobyć.) Zasadniczo Lift Web Framework nie ma zależności od tego, jak obiekty są zmaterializowana w sesję. Ponadto cykle sesji i żądania są otwarte w taki sposób, że wstawianie haków transakcyjnych do cyklu żądania/odpowiedzi jest proste.
  • Filozofia Lift 'a brzmi:" zespół serwerów musi znać jeden język, a nie wiele języków."Oznacza to, że konfiguracja odbywa się za pomocą Scali. Oznacza to, że nie musieliśmy implementować 40% konstrukcji języka Java w składni XML, aby stworzyć elastyczne opcje konfiguracji. Oznacza to, że składnia kompilatora i typ-sprawdza dane konfiguracyjne, dzięki czemu nie otrzymasz żadnego dziwnego parsowania XML lub nieprawidłowych danych w czasie wykonywania. Oznacza to, że nie musisz mieć IDE, które rozumieją szczegóły adnotacji, których używasz w oparciu o używaną bibliotekę. Tak, dokumentacja Lift ' a nie jest jego mocną stroną.

Mając powyższe na uwadze, pozwólcie, że opowiem trochę o filozofii projektowania Lift.

Napisałem Web Framework Manifest zanim zacząłem pisać Lift. Do wielkiego stopień i w większym stopniu niż w przypadku jakiegokolwiek innego frameworka internetowego, o którym wiem, Lift spełnia te cele.

Lift w swoim rdzeniu stara się wyodrębnić cykl żądania/odpowiedzi HTTP zamiast umieszczać owijarki obiektów wokół żądania HTTP. Na poziomie praktycznym oznacza to, że większość działań, które użytkownik może podjąć (przesyłanie elementów formularza, wykonywanie Ajax, itp.) jest reprezentowany przez GUID w przeglądarce i funkcję na serwerze. Gdy GUID jest prezentowany jako część an Żądanie HTTP, funkcja zostanie zastosowana (wywołana) z podanymi parametrami. Ponieważ GUID są trudne do przewidzenia i specyficzne dla sesji, ataki replay i wiele ataków manipulujących parametrami są znacznie trudniejsze z Lift niż większość innych frameworków internetowych, w tym Spring. Oznacza to również, że deweloperzy są bardziej produktywni, ponieważ koncentrują się na działaniach użytkownika i logice biznesowej związanej z działaniami użytkownika, a nie na pakowaniu i rozpakowywaniu żądania HTTP. Na przykład, kod do przyjęcia lub odrzucenia prośby o przyjaciela FourSquare:

ajaxButton("Accept", () => {request.accept.save; 
                            SetHtml("acceptrejectspan", <span/>}) ++ 
ajaxButton("Reject", () => {request.reject.save; 
                            SetHtml("acceptrejectspan", <span/>})
To takie proste. Ponieważ friendRequest znajduje się w obszarze podczas tworzenia funkcji, funkcja zamyka się nad zakresem... nie ma potrzeby ujawniania klucza głównego zaproszenia do znajomych ani robienia czegokolwiek innego... wystarczy zdefiniować tekst przycisku (może być zlokalizowany lub może być pobrany z szablonu XHTML lub może być pobrany ze zlokalizowanego szablonu) i funkcję do wykonania po naciśnięciu przycisku. Lift zajmuje się przypisywaniem GUID, konfigurowaniem połączenia Ajax (poprzez jQuery lub YUI, i tak, możesz dodać własną ulubioną bibliotekę JavaScript), wykonywaniem automatycznych powtórzeń z back-offami, unikaniem głodu połączenia poprzez kolejkowanie żądań Ajax itp.

Tak więc, jedną dużą różnicą między Lift A Spring jest to, że filozofia Lift GUID związana z funkcją ma podwójną zaletę znacznie lepszego bezpieczeństwa i znacznie lepszej wydajności programisty. Asocjacja funkcji GUID - > okazała się bardzo trwałe... ta sama konstrukcja działa dla formularzy normalnych, ajax, comet, kreatorów wielostronicowych itp.

Następny element Lift jest utrzymanie wysokiego poziomu abstrakcji wokół tak długo, jak to możliwe. Po stronie generowania strony oznacza to budowanie strony jako elementów XHTML i utrzymywanie strony jako XHTML aż do momentu strumieniowego przesyłania odpowiedzi. Korzyści to odporność na błędy cross site scripting, możliwość przenoszenia znaczników CSS do głowicy i skryptów do dołu strony po strona została skomponowana, a możliwość przepisania strony w oparciu o przeglądarkę docelową. Po stronie wejściowej adresy URL mogą być ponownie zapisywane w celu wyodrębnienia parametrów (zarówno parametrów kwerendy, jak i parametrów ścieżki) w sposób bezpieczny dla typu, dane o wysokim poziomie bezpieczeństwa są dostępne do przetworzenia bardzo wcześnie w cyklu żądania. Na przykład, oto jak zdefiniować obsługę żądania REST:

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

Używając wbudowanego dopasowania wzorców Scali, dopasowujemy przychodzące żądanie, wyodrębniamy trzecią część ścieżki i uzyskać użytkownika, który odpowiada tej wartości, a nawet zastosować kontrole kontroli dostępu (czy bieżąca sesja lub żądanie ma uprawnienia dostępu do danego rekordu użytkownika). Tak więc, zanim instancja użytkownika trafi w logikę aplikacji, jest sprawdzana.

Dzięki tym dwóm rdzeniom Lift ma ogromną przewagę pod względem bezpieczeństwa. Aby dać ci wyobrażenie o wielkości zabezpieczeń Lift, które nie przeszkadzają funkcjom, Rasmus Lerdorg kto zrobił zabezpieczenia dla Yahoo! jeśli chodzi o FourSquare (jeden ze stron z plakatem Dla Dzieci):

Cztery gwiazdki dla @ foursquare - 1st site in a while I have take a good look at that didn ' t have a single security issue (that I could find) -- http://twitter.com/rasmus/status/5929904263

W tym czasie FourSquare miał jednego inżyniera pracującego nad kodem (nie, że @harryh nie jest super-geniuszem), a jego głównym celem było ponowne napisanie wersji PHP FourSquare podczas radzenia sobie z weekly podwojenie ruchu.

Ostatnią częścią bezpieczeństwa Lift jest SiteMap. To ujednolicony system kontroli dostępu, nawigacji po witrynie i menu. Programista definiuje reguły kontroli dostępu dla każdej strony za pomocą kodu Scala (np. If(User.loggedIn _) lub If(User.superUser _)) i te reguły kontroli dostępu są stosowane przed rozpoczęciem renderowania strony. Jest to bardzo podobne do Spring Security, z tym, że jest wypiekany od początku projektu, a reguły kontroli dostępu są zunifikowane z resztą aplikacji, więc nie musisz mieć procesu aktualizacji reguł bezpieczeństwa w XML, gdy zmieniają się adresy URL lub metody obliczające zmianę kontroli dostępu.

Podsumowując do tej pory, filozofia projektowania Lift daje korzyści z pieczenia w kontroli dostępu, odporność na top 10 luk bezpieczeństwa OWASP, znacznie lepszą obsługę Ajax i znacznie wyższą produktywność programistów niż Spring.

Ale Lift daje Ci również najlepszą obsługę komety ze wszystkich frameworków internetowych. Dlatego Novell wybrał Lift do zasilania swojego produktu Pulse i oto, co Novell ma do powiedzenia na temat Lift:

Lift to rodzaj frameworka internetowego, który umożliwia Ci jako deweloperowi skoncentruj się na szerszej perspektywie. Mocne, wyraziste pisanie i funkcje wyższego poziomu, takie jak wbudowana obsługa Comet pozwala na skupić się na innowacjach zamiast na hydraulika. Budowanie bogatego, w czasie rzeczywistym aplikacja internetowa jak Novell Pulse wymaga RAM z mocą Winda pod okładki.

Lift nie jest więc kolejnym frameworkiem MVC. To ramy, które mają za sobą kilka podstawowych zasad projektowania, które dojrzały bardzo dobrze. Jest to framework, który daje podwójne zalety bezpieczeństwa i produktywności deweloperów. Lift to framework, który jest zbudowany w warstwach i daje deweloperowi właściwe wybory w zależności od jego potrzeb... wybory do generowania widoków, wybory do uporczywości itp.

Scala i Lift dają programistom znacznie lepsze doświadczenie niż melanż XML, adnotacje i inne idiomy, które składają się na wiosnę.

 229
Author: David Pollak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-20 08:35:53

Polecam sprawdzić Framework play, ma kilka ciekawych pomysłów i wspiera rozwój w Javie i Scali

 11
Author: IPC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-24 01:24:49

Tylko dla Zabawy. Oraz w celu nauki nowych metod programowania.

 10
Author: Roman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-21 14:42:36

Mocno przyjrzałem się użyciu Lift dla niedawnego projektu internetowego, nie będąc wielkim fanem Spring MVC. Nie korzystałem z najnowszych wersji, ale wcześniejsze wersje Spring MVC sprawiły, że skakałeś przez wiele obręczy, aby uruchomić aplikację internetową. Byłem prawie sprzedany na windzie, dopóki nie zobaczyłem, że Winda może być bardzo zależna od sesji i wymagałaby "sticky sessions", aby działać poprawnie. Fragment http://exploring.liftweb.net/master/index-9.html#sec:Session-Management

Dopóki nie będzie standardowej technologii replikacji sesji, można jeszcze klaster aplikacji za pomocą "sticky session". This meas that all żądania odnoszące się do sesji HTTP muszą być przetwarzane przez to samo węzeł klastra

Więc gdy sesja jest wymagana, użytkownik musi być pin do tego węzła. Stwarza to potrzebę inteligentnego równoważenia obciążenia i wpływa na skalowanie, co uniemożliwiło Liftowi bycie rozwiązaniem w moim przypadku. Skończyło się na tym, że wybrałem http://www.playframework.org i byli bardzo zadowoleni. Play jest stabilny i niezawodny do tej pory i bardzo łatwy w obsłudze.

 10
Author: mguymon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-15 19:37:12

I nie przybyłem, aby podnieść i Scalę z środowiska Java, więc nie jest to z osobistego doświadczenia, ale wiem, że wielu programistów Lift uważa Scalę za znacznie bardziej zwięzły i wydajny język niż Java.

 7
Author: pr1001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-17 13:41:29

Poszerzanie wiedzy to zawsze coś wartego uwagi:) właśnie zacząłem uczyć się Scali, wpływa to na to jak piszę normalną Javę i mogę powiedzieć, że do tej pory było to bardzo korzystne.

 3
Author: gpampara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-21 15:37:08

Nienawidzę całkowicie rzucać twój świat dla pętli. Ale możesz użyć Scala, Java, Lift, Spring w jednej aplikacji i nie będzie to problemem.

 3
Author: Berlin Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-23 21:33:43

Moim skromnym zdaniem liczy się wyobraźnia.

Rozważmy, że chcesz napisać aplikację. Jeśli jesteś przyzwoitym programistą, aplikacja powinna być już budowana w twoim umyśle. Następnym krokiem jest odkrycie, jak to działa za pomocą kodu. Aby to zrobić, musisz przekazać wyimaginowaną aplikację za pomocą funkcji, która przekłada ją na aplikację w prawdziwym świecie. Ta funkcja jest językiem programowania. So

Real app = programming language (imagined app)
Więc wybór języka jest ważny. Tak samo jak ramy. Jest mnóstwo inteligentni ludzie, którzy doradzą ci, co wybrać, ale ostatecznie język / ramy, które najlepiej przekładają Twoją wyobraźnię, powinny być twoim wyborem. Więc prototyp z obu i dokonać wyboru. Co do mnie, to powoli uczę się Scali, Lift i uwielbiam ją.
 0
Author: Matei Alexandru Bogdan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-25 11:27:57

Ale głównym problemem jest to, że nie możemy porównać sprężyny z windą. Lift jest zasadniczo używany jako Framework UI, A Spring jako framework DI.
Jeśli tworzysz aplikację internetową, która ma tyle zaplecza, możesz użyć lift.
ale jeśli twój rozwój aplikacji internetowej, które mają niektóre backend serii i definelty trzeba Goto spring.

 0
Author: Rajith Delantha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-06 14:51:57