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?
151
Respostas:
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.
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 ...
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.
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.
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.
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.
fonte
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.
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.
É 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:
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):
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 _)
ouIf(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:
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.
fonte
Eu recomendo que você verifique o framework do jogo, ele tem algumas idéias muito interessantes e suporta o desenvolvimento em Java e Scala
fonte
Apenas por diversão. E para aprender novas abordagens de programação.
fonte
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
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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
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.
fonte
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.
fonte