Por que eu usaria o Scala / Lift sobre Java / Spring? [fechadas]

151

Sei que essa pergunta está um pouco aberta, mas estive olhando o Scala / Lift como uma alternativa ao Java / Spring e me pergunto quais são as vantagens reais que o Scala / Lift tem sobre ele. Da minha perspectiva e experiência, as anotações Java e Spring realmente minimizam a quantidade de codificação que você precisa fazer para um aplicativo. O Scala / Lift melhora isso?

Chris J
fonte
A pergunta é muito antiga. Mas agora a pergunta seria "Por que devo usar o Scala / Play over XYX" e há muitas boas razões. Mudei-me para o Play e nunca olhei para trás.
precisa saber é o seguinte

Respostas:

113

Vamos supor que estamos igualmente à vontade no Scala e Java e ignorar as (enormes) diferenças de idioma, exceto no que diz respeito ao Spring ou Lift.

Spring e Lift são quase diametralmente opostos em termos de maturidade e objetivos.

  • A primavera é cerca de cinco anos mais velha que o Lift
  • A elevação é monolítica e visa apenas a web; O Spring é modular e tem como alvo aplicativos da web e "regulares"
  • O Spring suporta uma infinidade de recursos do Java EE; O elevador ignora essas coisas

Em uma frase, a primavera é pesada e a elevação é leve. Com determinação e recursos suficientes, você pode mudar isso de cabeça para baixo, mas precisaria de muitos dos dois.

Aqui estão algumas diferenças concretas que ficaram na minha mente depois de trabalhar com as duas estruturas. Esta não é uma lista exaustiva, que não posso compilar de qualquer maneira. Apenas o que me pareceu mais interessante ...

  1. Ver filosofia

    A elevação incentiva a inserção de algum material da visualização nos métodos de snippet / ação. O código do snippet será especialmente polvilhado com elementos de formulário gerados programaticamente, <div>s, <p>s etc.

    Isso é poderoso e útil, especialmente porque o Scala possui um modo XML interno no nível da linguagem. Pode-se escrever XML embutido nos métodos Scala, incluindo ligações variáveis ​​entre chaves. Isso pode ser agradável para serviços XML ou modelos de serviços muito simples - você pode executar um conjunto de ações de resposta HTTP em um arquivo esplendidamente conciso, sem modelos ou muita configuração de atendente. A desvantagem é a complexidade. Dependendo de quão longe você vai, há uma separação vaga de preocupações entre visão e lógica ou nenhuma separação.

    Por outro lado, o uso regular do Spring para aplicativos da web impõe uma forte separação entre a visualização e tudo o mais. Acho que o Spring suporta vários mecanismos de modelagem, mas só usei JSP em algo sério. Fazer um design "MVC difuso" inspirado no Lift com JSP seria uma loucura. Isso é bom em projetos maiores, onde o tempo para apenas ler e entender pode ser avassalador.

  2. Opções de Mapeador de Objeto-Relacional

    O ORM interno do elevador é "Mapper". Existe uma alternativa futura chamada "Record", mas acho que ainda é considerada pré-alfa. O LiftWeb Book possui seções sobre o uso do Mapper e JPA.

    O recurso CRUDify do Lift , por mais legal que seja, funciona apenas com o Mapper (e não o JPA).

    É claro que o Spring suporta uma variedade de tecnologias de banco de dados padrão e / ou maduras . A palavra operativa lá é "suportes". Teoricamente, você pode usar qualquer Java ORM com Lift, pois é possível chamar código Java arbitrário da Scala. Mas o Lift realmente suporta apenas o Mapper e (em uma extensão muito menor) o JPA. Além disso, trabalhar com código Java não trivial no Scala atualmente não é tão fácil quanto se pode gostar; usando um Java ORM, você provavelmente se encontrará usando as coleções Java e Scala em qualquer lugar ou convertendo todas as coleções dentro e fora dos componentes Java.

  3. Configuração

    Os aplicativos de elevação são configurados praticamente por meio de um método de classe "Boot" em todo o aplicativo. Em outras palavras, a configuração é feita através do código Scala. Isso é perfeito para projetos com configurações breves e quando a pessoa que faz a configuração se sente confortável em editar o Scala.

    A primavera é bastante flexível em termos de configuração. Muitas opções de conf podem ser direcionadas através da configuração XML ou anotações.

  4. Documentação

    A documentação do elevador é jovem. Os documentos da primavera são bem maduros. Não há concurso.

    Como os documentos do Spring já são bem organizados e fáceis de encontrar, analisarei os documentos que encontrei para o Lift. Existem basicamente quatro fontes de documentação do Lift: o LiftWeb Book , o API Docs , o grupo do LiftWeb no Google e " Getting Started ". Há também um bom conjunto de exemplos de código, mas eu não os chamaria de "documentação" por si só.

    Os documentos da API estão incompletos. O LiftWeb Book foi publicado em árvores, mas também está disponível gratuitamente online. É realmente útil, embora seu estilo decididamente didático me irritasse às vezes. É um pouco longo no tutorial e curto no contrato. A primavera possui um manual adequado, que o Lift não possui.

    Mas o Lift tem um bom conjunto de exemplos. Se você se sente à vontade lendo o código de elevação e o código de exemplo (e já conhece bem o Scala), pode resolver o problema em pouco tempo.

Ambas as estruturas são convincentes. Há uma ampla variedade de aplicativos em que você pode escolher ou fazer o bem.

Dan LaRocque
fonte
10
Uma boa resposta, no entanto, um ponto em que discordo é: a primavera é pesada. Ele possui uma ampla gama de bons APIS e impõe certas formas estruturais de trabalho necessárias para obter um bom resultado, mas, comparado ao material J2EE que substituiu originalmente, é uma solução muito mais leve. É claro que "leveza" está nos olhos de quem vê, então esse é definitivamente um argumento subjetivo. Apenas meus 2 centavos então.
Brian
3
Boa resposta, muito objetivo. O Lift faz muitas coisas aparentemente inteligentes, que são muito estúpidas. Mover a lógica da página para o back-end, misturando HTML ao código de escala, o que é pior do que as tags de controle dentro do modelo de página. Não sei por que eles fizeram isso, talvez pensem que o Scala deve processar XML de maneira incrivelmente rápida. "O guia definitivo para o levantamento" é o pior livro de tecnologia que eu já li.
Sawyer
Não estou tão familiarizado com elevador como gostaria de estar. Na sua opinião, quão difícil seria criar um wrapper para o objeto de inicialização que, em vez disso, lê as configurações de um arquivo xml? Minha primeira impressão é que, já que o scala lida com xml tão rapidamente, não seria excepcionalmente difícil.
Ape-inago
Sawyer, o fato de você poder misturar HTML com código de scala não diz que você precisa. O uso de snippets de maneira inteligente separará o código HTML e Scala. Mas hey, manter-se usando as tags de controle;)
Alebon
1
@ Dan, existem atualizações agora que o Lift tem o dobro da idade de quando você escreveu isso?
Pacerier 17/02
229

Devo dizer que discordo totalmente da resposta de Dan LaRocque.

A elevação não é monolítica. É composto por elementos discretos. Ele não ignora os elementos J / EE, suporta tipos JNDI, JTA, JPA, etc. O fato de você não ser forçado a usar esses elementos do J / EE é uma forte indicação do design modular do Lift.

  • A filosofia da visão de Lift é "deixar o desenvolvedor decidir". O Lift oferece um mecanismo de modelo que não permite nenhum código lógico na exibição, um mecanismo de exibição baseado na execução do código Scala e literais XML do Scala e um mecanismo de exibição baseado no Scalate . Se você escolher o mecanismo de modelagem XML, poderá escolher quanto, se houver, a marcação pertence à sua lógica de negócios. A separação de visualizações do Lift é mais forte do que qualquer coisa que a Spring tenha a oferecer, porque você não pode expressar nenhuma lógica comercial nos modelos XML do Lift.
  • O objeto de Lift philosophy A filosofia de persistência é "deixe o desenvolvedor decidir". O Lift possui o Mapper, que é um mapeador relacional do objeto de estilo ActiveRecord. Faz o trabalho para pequenos projetos. Levante o suporte JPA. O Lift tem uma abstração de registro que suporta a transferência de objetos para dentro e fora de bancos de dados relacionais, dentro e fora dos armazenamentos NoSQL (o Lift inclui suporte nativo para CouchDB e MongoDB, mas as camadas do adaptador são algumas centenas de linhas de código, portanto, se você quiser Cassandra ou outra coisa, não é muito trabalhoso obtê-lo.) Basicamente, o Lift the Web Framework não depende de como os objetos são materializados em uma sessão. Além disso, os ciclos de sessão e solicitação são abertos de forma que a inserção de ganchos de transação no ciclo de solicitação / resposta seja simples.
  • A filosofia de Lift é "a equipe do servidor precisa conhecer um idioma, não vários idiomas". Isso significa que a configuração é feita via Scala. Isso significa que não tivemos que implementar 40% das construções da linguagem Java na sintaxe XML para criar opções de configuração flexíveis. Isso significa que a sintaxe do compilador e verifica os dados de configuração para que você não obtenha nenhuma análise XML estranha ou dados incorretos no tempo de execução. Significa que você não precisa ter IDEs que entendam os detalhes das anotações que você está usando, com base na biblioteca que está usando.
  • Sim, a documentação do Lift não é seu ponto forte.

Com o exposto, deixe-me falar um pouco sobre a filosofia de design do Lift.

Escrevi o Manifesto do Web Framework antes de começar a escrever o Lift. Em grande parte e em maior grau do que qualquer outra estrutura da Web que eu conheça, o Lift atende a esses objetivos.

O Lift em sua essência procura abstrair o ciclo de solicitação / resposta HTTP em vez de colocar wrappers de objeto em torno da Solicitação HTTP. No nível prático, isso significa que quase todas as ações que um usuário pode executar (enviar elementos de formulário, executar Ajax etc.) são representadas por um GUID no navegador e uma função no servidor. Quando o GUID é apresentado como parte de uma solicitação HTTP, a função é aplicada (chamada) com os parâmetros fornecidos. Como os GUIDs são difíceis de prever e específicos da sessão, os ataques de repetição e muitos ataques de violação de parâmetros são muito mais difíceis com o Lift do que a maioria das outras estruturas da Web, incluindo o Spring. Isso também significa que os desenvolvedores são mais produtivos porque se concentram nas ações do usuário e na lógica de negócios associada às ações do usuário, em vez do encanamento de empacotar e descompactar uma solicitação HTTP.

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

É simples assim. Como o friendRequest está no escopo quando a função é criada, a função fecha sobre o escopo ... não há necessidade de expor a chave primária da solicitação de amizade ou fazer qualquer outra coisa ... basta definir o texto do botão (ele pode ser localizado ou extraído de um modelo XHTML ou extraído de um modelo localizado) e a função a ser executada quando o botão é pressionado. O Lift cuida da atribuição do GUID, da configuração da chamada Ajax (via jQuery ou YUI, e sim, você pode adicionar sua própria biblioteca JavaScript favorita), realizando tentativas automáticas com afastamentos, evitando a inanição da conexão na fila de solicitações do Ajax, etc.

Portanto, uma grande diferença entre o Lift e o Spring é que a filosofia do GUID do Lift associada à função tem o duplo benefício de uma segurança muito melhor e uma produtividade do desenvolvedor muito melhor. A associação GUID -> Function provou ser muito durável ... a mesma construção funciona para formas normais, ajax, cometa, assistentes de várias páginas, etc.

A próxima parte principal do Lift é manter as abstrações de alto nível por mais tempo possível. No lado da geração da página, isso significa criar a página como elementos XHTML e mantê-la como XHTML até pouco antes de transmitir a resposta. Os benefícios são a resistência a erros de script entre sites, a capacidade de mover tags CSS para a cabeça e scripts para a parte inferior da página após a composição da página e a capacidade de reescrever a página com base no navegador de destino. No lado da entrada, os URLs podem ser reescritos para extrair parâmetros (tanto os parâmetros de consulta quanto o caminho) de uma maneira segura e de alto nível, dados verificados de segurança estão disponíveis para processamento muito cedo no ciclo de solicitação. Por exemplo, veja como definir a manutenção de uma solicitação REST:

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

Usando a correspondência de padrões incorporada do Scala, correspondemos a uma solicitação recebida, extraímos a terceira parte do caminho e obtemos o Usuário que corresponde a esse valor e até aplicamos verificações de controle de acesso (a sessão ou solicitação atual tem permissões para acessar a determinada Registro do usuário). Portanto, quando a instância do usuário atinge a lógica do aplicativo, ela é examinada.

Com essas duas peças principais, o Lift tem uma enorme vantagem em termos de segurança. Para ter uma idéia da magnitude da segurança do Lift que não atrapalha os recursos, Rasmus Lerdorg, que fez a segurança do Yahoo! tinha a dizer sobre o FourSquare (um dos sites filhos do pôster do Lift):

Quatro estrelas no @foursquare - 1º site há algum tempo, observei que não havia um único problema de segurança (que eu poderia encontrar) - http://twitter.com/rasmus/status/5929904263

Na época, o FourSquare tinha um engenheiro trabalhando no código (não que @harryh não fosse um super-gênio) e seu foco principal era reescrever a versão PHP do FourSquare enquanto lidava com a duplicação de tráfego semanal.

A última parte do foco de segurança do Lift é o SiteMap. É um controle de acesso unificado, navegação no site e sistema de menus. O desenvolvedor define as regras de controle de acesso para cada página usando o código Scala (por exemplo, If(User.loggedIn _)ou If(User.superUser _)) e essas regras de controle de acesso são aplicadas antes do início de qualquer renderização de página. Isso é muito parecido com o Spring Security, exceto pelo fato de ele ser incorporado desde o início do projeto e as regras de controle de acesso serem unificadas com o restante do aplicativo, para que você não precise ter processo para atualizar as regras de segurança em XML quando os URLs ou os métodos que calculam a alteração do controle de acesso.

Para resumir até agora, a filosofia de design do Lift oferece os benefícios de controle de acesso, resistência às 10 principais vulnerabilidades de segurança da OWASP, suporte Ajax muito melhor e produtividade do desenvolvedor muito maior do que a Spring.

Mas o Lift também oferece o melhor suporte ao Cometa de qualquer estrutura da Web. É por isso que a Novell escolheu o Lift para alimentar seu produto Pulse e aqui está o que a Novell tem a dizer sobre o Lift:

Lift é o tipo de estrutura da web que permite que você, como desenvolvedor, se concentre no cenário geral. Digitação forte e expressiva e recursos de nível superior, como o suporte interno do Comet, permitem que você se concentre na inovação em vez do encanamento. A criação de um aplicativo Web rico e em tempo real como o Novell Pulse requer uma estrutura com o poder do Lift sob as cobertas.

Portanto, o Lift não é apenas mais uma estrutura MVC "eu-também". É uma estrutura que possui alguns princípios básicos de design que amadureceram muito bem. É uma estrutura que oferece as vantagens duplas de segurança e produtividade do desenvolvedor. O Lift é uma estrutura construída em camadas e oferece ao desenvolvedor as escolhas certas com base em suas necessidades ... opções para geração de visualizações, opções para persistência etc.

O Scala e o Lift oferecem aos desenvolvedores uma experiência muito melhor do que a mistura de XML, anotações e outros idiomas que compõem o Spring.

David Pollak
fonte
2
Uma versão arquivada do blog.lostlake.org/index.php?/archives/16-Web-Framework-Manifesto.html está disponível em replay.web.archive.org/20070220231839/http://blog.lostlake.org/…
Alan Hecht
1
Você teve-me em suporte nativo MongoDB ... Estou em
Eran Medan
8
Escrevo webapps desde meados dos anos 90. Eu usei Perl, Java, Seam, JSP e muitos outros. Todo mundo que conheço que usa o Spring reclama da dificuldade de acertar as configurações e dependências, pesadelos, etc. Comecei a usar o Lift em um projeto há algumas semanas e estou absolutamente impressionado. É a primeira estrutura (e linguagem) que usei onde as coisas funcionam quase sem esforço. Eu escrevi dezenas de recursos no meu aplicativo até agora e fico continuamente impressionado com a rapidez com que eu acerto ... mesmo com documentos ruins e um entendimento limitado do Scala. Ver é crer.
Tony K.
@TonyK .: certamente o Spring é pesado, mas será recompensado se o aplicativo da web for alterado muito mais tarde, pois é muito mais fácil refatorar / estender com o Spring. IMHO, isso depende. Eu usei alguns outros frameworks, como o Grails, em pequenos projetos e acho que é perfeito para isso - mas para algo mudar muito mais tarde, eu iria com o Spring.
Hoàng Long
7
@ HoàngLong Existem muitas abordagens para a dificuldade da evolução do software. Estou simplesmente afirmando minha experiência: Java está mostrando sua idade como linguagem, assim como os frameworks construídos sobre ela. Hora de evoluir para coisas que são mais expressivas e poderosas sem toda a loucura do clichê e da configuração.
Tony K.
11

Eu recomendo que você verifique o framework do jogo, ele tem algumas idéias muito interessantes e suporta o desenvolvimento em Java e Scala

IPC
fonte
2
Eu verifiquei o Play. Não vi nada, exceto a classe interna recarregando para recomendá-lo, e com a licença gratuita Scala JRebel, você obtém isso com o Lift.
Tony K.
10

Apenas por diversão. E para aprender novas abordagens de programação.

romano
fonte
10

Pensei fortemente em usar o Lift em um projeto recente da Web, não sendo um grande fã do Spring MVC. Não usei as versões mais recentes, mas as versões anteriores do Spring MVC fizeram com que você passasse por muitos obstáculos para obter um aplicativo da Web em execução. Eu estava quase vendido no Lift até perceber que o Lift pode ser muito dependente da sessão e exigiria que 'sessões fixas' funcionassem corretamente. Trecho de http://exploring.liftweb.net/master/index-9.html#sec:Session-Management

Até que exista uma tecnologia de replicação de sessão padrão, você ainda pode agrupar seu aplicativo usando a "sessão permanente". Isso significa que todos os pedidos pertencentes a uma sessão HTTP devem ser processados ​​pelo mesmo nó do cluster

Portanto, uma vez que uma sessão seja necessária, o usuário precisará ser fixado nesse nó. Isso cria a necessidade de balanceamento inteligente de carga e afeta o dimensionamento, o que impediu o Lift de ser uma solução no meu caso. Acabei selecionando http://www.playframework.org/ e fiquei muito satisfeito. O jogo tem sido estável e confiável até agora e muito fácil de trabalhar.

mguymon
fonte
7

Eu não vim para o Lift e o Scala com experiência em Java, então isso não é por experiência pessoal, mas sei que muitos desenvolvedores do Lift consideram o Scala uma linguagem muito mais concisa e eficiente que o Java.

pr1001
fonte
3

Expandir seu conhecimento é sempre um esforço que vale a pena :) Comecei a aprender Scala, está afetando a maneira como escrevo Java normal e posso dizer que tem sido muito benéfico até agora.

gpampara
fonte
3

Eu odeio jogar completamente seu mundo para dar uma volta. Mas você pode usar Scala, Java, Lift, Spring em um aplicativo e fazer com que não seja um problema.

Berlin Brown
fonte
0

Na minha humilde opinião, a imaginação é o que importa.

Vamos considerar que você deseja escrever um aplicativo. Se você é um desenvolvedor decente, o aplicativo já deve ser criado em sua mente. O próximo passo é descobrir como isso funciona através do código. Para fazer isso, você precisa passar o aplicativo imaginado por uma função que o converte em um aplicativo do mundo real. Essa função é uma linguagem de programação. assim

Real app = programming language (imagined app)

Portanto, a escolha do idioma é importante. Então é o quadro. Há várias pessoas inteligentes aqui que o aconselharão sobre o que escolher, mas, em última análise, o idioma / estrutura que melhor traduz sua imaginação deve ser a sua escolha. Então protótipo com ambos e faça sua escolha.

Quanto a mim, estou aprendendo lentamente Scala e Lift e adorando.

Matei Alexandru Bogdan
fonte
0

Mas o principal problema é que não podemos comparar a primavera com a sustentação. O elevador é basicamente usado como estrutura de interface do usuário e o Spring é usado como estrutura de DI.
Se você estiver desenvolvendo um aplicativo da Web que tenha muito de back-end, pode usar o elevador.
mas se o seu aplicativo da web em desenvolvimento que possui algumas infra-estruturas em série e você definitivamente precisar ir para a primavera.

Rajith Delantha
fonte