Я знаю, что этот вопрос немного нерешен, но я смотрел на Scala/Lift как на альтернативу Java/Spring, и интересно, что является реальными преимуществами, которые Scala/Lift имеет по нему. С моей точки зрения и опыта, Аннотаций Java и Spring действительно минимизирует объем кодирования этого, необходимо сделать для приложения. Scala/Lift улучшает это?
Предположим, что мы одинаково хорошо знакомы с Scala и Java, и игнорируем (огромные) языковые различия, за исключением тех, которые относятся к Spring или Lift.
Spring и Lift почти диаметрально противоположны с точки зрения зрелости и целей.
В одном предложении Spring - это тяжелый вес, а Lift - легкий. При наличии достаточной решимости и ресурсов вы можете перевернуть это с ног на голову, но вам потребуется лот обоих.
Вот конкретные различия, которые запомнились мне после работы с обоими фреймворками. Это не исчерпывающий список, который я все равно не могу составить. Как раз то, что мне показалось наиболее интересным ...
Философия просмотра
Lift рекомендует размещать некоторые материалы для просмотра в методах сниппетов / действий. Код фрагмента будет особенно усыпан программно сгенерированными элементами формы, Это мощный и полезный инструмент, особенно с учетом того, что Scala имеет встроенный режим XML на уровне языка. Можно написать встроенный XML в методы Scala, включая привязки переменных в фигурных скобках.Это может быть приятно для очень простых XML-сервисов или макетов сервисов - вы можете создать набор действий HTTP-ответа в одном великолепно кратком файле, без шаблонов или дополнительной конфигурации. Обратной стороной является сложность. В зависимости от того, как далеко вы зашли, существует либо нечеткое разделение проблем между представлением и логикой, либо отсутствие разделения. Напротив, регулярное использование Spring для веб-приложений обеспечивает четкое разделение между представлением и всем остальным. Я думаю, что Spring поддерживает несколько движков шаблонов, но я использовал JSP только во всём серьёзном. Создание «нечеткого» MVC-дизайна в стиле Lift с помощью JSP было бы безумием. Это хорошо для крупных проектов, когда просто читать и понимать может утомительно. Выбор объектно-реляционного преобразователя. ORM, встроенный в Lift, - «преобразователь». В ближайшее время появится альтернатива под названием «Record», но я думаю, что она все еще считается пре-альфа. В книге LiftWeb есть разделы, посвященные использованию как Mapper, так и JPA. Функция Lift CRUDify , какая бы классная она ни была, работает только с Mapper (а не с JPA). Конечно, Spring поддерживает набор стандартных и / или зрелых технологий баз данных . Здесь ключевое слово «поддерживает». Теоретически вы можете использовать любую Java ORM с Lift, поскольку вы можете вызывать произвольный Java-код из Scala. Но Lift действительно поддерживает только Mapper и (в гораздо меньшей степени) JPA.Кроме того, работа с нетривиальным кодом Java в Scala в настоящее время не так проста, как хотелось бы; используя Java ORM, вы, вероятно, обнаружите, что либо используете повсюду как коллекции Java, так и Scala, либо конвертируете все коллекции в компоненты Java и из них. Конфигурация Приложения Lift настраиваются почти полностью с помощью метода класса «Boot» для всего приложения. Другими словами, настройка выполняется с помощью кода Scala. Это идеально подходит для проектов с краткими настройками, и когда человек, выполняющий настройку, может удобно редактировать Scala. Spring довольно гибок с точки зрения конфигурации. Множество параметров conf можно управлять либо с помощью конфигурации XML, либо с помощью аннотаций. Документация Документация Лифта молода. Документы Spring довольно зрелые. Нет конкурса. Поскольку документы Spring уже хорошо организованы и их легко найти, я рассмотрю найденные мной документы для Lift. Существует четыре основных источника документации Lift: LiftWeb Book , API Docs , группа Google LiftWeb и « Начало работы » . Также есть хороший набор примеров кода, но я бы не стал называть их «документацией» как таковой. Документация API неполная. Книга LiftWeb опубликована на деревьях, но она также находится в свободном доступе в Интернете. Он действительно полезен, хотя его явно дидактический стиль временами меня раздражал. Это немного длинно по учебнику и мало по контракту. Spring имеет соответствующее руководство, которого нет у Lift. Но у Lift есть хороший набор примеров.Если вам удобно читать код Lift и пример кода (и вы уже хорошо знаете Scala), вы можете решить все в довольно короткие сроки. Обе концепции убедительны. Существует широкий спектр приложений, в которых вы можете выбрать любое из них и преуспеть.
s и т. Д.
Расширение ваших знаний - всегда стоящая задача :) Я только начал изучать Scala, это влияет на то, как я пишу обычную Java, и я могу сказать, что это было очень полезно, поэтому далеко.
Я бы порекомендовал вам проверить игровой фреймворк, он содержит очень интересные идеи и поддерживает разработку на Java и Scala.
Просто так. И ради изучения новых подходов к программированию.
I пришел в Lift и Scala не на основе Java, так что это не из личного опыта, но я знаю, что многие разработчики Lift считают Scala гораздо более кратким и эффективным языком, чем Java.
Ненавижу бросать ваш мир в тупик. Но вы можете использовать Scala, Java, Lift, Spring в одном приложении, и это не будет проблемой.
Должен сказать, что я категорически не согласен с ответом Дэна ЛаРокка.
Lift не является монолитным. Он состоит из дискретных элементов. Он не игнорирует элементы J/EE, он поддерживает такие элементы, как JNDI, JTA, JPA и т.д. Тот факт, что вы не вынуждены использовать эти элементы J/EE, является сильным признаком модульного дизайна Lift.
Учитывая вышесказанное, позвольте мне немного поговорить о философии проектирования Lift.
Я написал Web Framework Manifesto до того, как начал писать Lift. В значительной степени, и в большей степени, чем для любого другого известного мне веб-фреймворка, Lift отвечает этим целям.
В своей основе Lift стремится абстрагироваться от цикла HTTP-запрос/ответ, а не создавать объектные обертки вокруг HTTP-запроса. На практическом уровне это означает, что почти любое действие, которое может выполнить пользователь (отправка элементов формы, выполнение Ajax и т.д.), представлено GUID в браузере и функцией на сервере. Когда GUID представлен как часть HTTP-запроса, функция применяется (вызывается) с заданными параметрами. Поскольку GUID трудно предсказуемы и зависят от сессии, Атаки повторного воспроизведения и многие атаки с подменой параметров гораздо сложнее с Lift, чем с большинством других веб-фреймворков, включая Spring. Это также означает, что разработчики работают более продуктивно, поскольку они сосредоточены на действиях пользователя и бизнес-логике, связанной с ними, а не на упаковке и распаковке HTTP-запроса. Например, код для принятия или отклонения запроса друга FourSquare:
ajaxButton("Accept", () => {request.accept.save;
SetHtml("acceptrejectspan", <span/>}) ++
ajaxButton("Reject", () => {request.reject.save;
SetHtml("acceptrejectspan", <span/>})
Все просто. Поскольку friendRequest находится в области видимости при создании функции, функция закрывает область видимости... нет необходимости раскрывать первичный ключ запроса друга или делать что-либо еще... просто определите текст кнопки (он может быть локализован или взят из шаблона XHTML, или взят из локализованного шаблона) и функцию, которая будет выполняться при нажатии кнопки. Lift позаботится о присвоении GUID, настройке вызова Ajax (через jQuery или YUI, и да, вы можете добавить свою собственную любимую библиотеку JavaScript), выполнении автоматических повторных попыток с обратными вызовами, предотвращении голодания соединения путем постановки Ajax-запросов в очередь и т.д.
Итак, одно большое различие между Lift и Spring заключается в том, что философия Lift - GUID, связанный с функцией, имеет двойное преимущество: гораздо лучшая безопасность и гораздо лучшая производительность разработчика. Ассоциация GUID -> функция оказалась очень долговечной... та же конструкция работает для обычных форм, ajax, comet, многостраничных мастеров и т.д.
Следующим основным элементом Lift является сохранение высокоуровневых абстракций как можно дольше. Со стороны генерации страницы это означает создание страницы в виде элементов XHTML и сохранение страницы в виде XHTML до момента передачи ответа. Преимуществами являются устойчивость к ошибкам межсайтового скриптинга, возможность перемещения тегов CSS в заголовок и скриптов в нижнюю часть страницы после ее создания, а также возможность переписать страницу в зависимости от целевого браузера. На стороне ввода, URL-адреса могут быть переписаны для извлечения параметров (как параметров запроса, так и параметров пути) безопасным для типов образом, данные высокого уровня, проверенные на безопасность, доступны для обработки на самом раннем этапе цикла запроса. Например, вот как можно определить обслуживание REST-запроса:
serve {
case "api" :: "user" :: AsUser(user) :: _ XmlGet _ => <b>{user.name}</b>
case "api" :: "user" :: AsUser(user) :: _ JsonGet _ => JStr(user.name)
}
Используя встроенное в Scala сопоставление шаблонов, мы сопоставляем входящий запрос, извлекаем третью часть пути и получаем User, соответствующий этому значению, и даже применяем проверку контроля доступа (имеет ли текущая сессия или запрос разрешения на доступ к данной записи User). Таким образом, к тому моменту, когда экземпляр пользователя попадает в прикладную логику, он уже проверен.
Благодаря этим двум основным компонентам Lift имеет огромное преимущество в плане безопасности. Чтобы дать вам представление о масштабах безопасности Lift, которая не мешает функциям, Расмус Лердорг, который занимался безопасностью в Yahoo!, так отозвался о FourSquare (один из сайтов-плакатов Lift):
Четыре звезды @foursquare - первый сайт за последнее время, который я внимательно изучил и который не имеет ни одной проблемы безопасности (которую я смог найти) - http://twitter. com/rasmus/status/5929904263
В то время над кодом FourSquare работал один инженер (не то чтобы @harryh не был супер-гением), и его основной задачей было переписать PHP-версию FourSquare, справляясь при этом с удвоением еженедельного трафика.
Последняя часть Lift, посвященная безопасности, - это SiteMap. Это единая система контроля доступа, навигации по сайту и меню. Разработчик определяет правила контроля доступа для каждой страницы с помощью кода Scala (например, If(User.loggedIn _)
или If(User.superUser _)
), и эти правила контроля доступа применяются до начала рендеринга страницы. Это очень похоже на Spring Security, за исключением того, что это встроено с самого начала проекта, и правила контроля доступа унифицированы с остальной частью приложения, поэтому вам не нужно иметь процесс обновления правил безопасности в XML, когда URL меняются или меняются методы, которые вычисляют контроль доступа.
Подводя итог, можно сказать, что философия проектирования Lift дает вам преимущества встроенного контроля доступа, устойчивость к 10 лучшим уязвимостям безопасности OWASP, гораздо лучшую поддержку Ajax и гораздо более высокую производительность разработчиков, чем Spring.
Но Lift также предоставляет лучшую поддержку Comet среди всех существующих веб-фреймворков. Именно поэтому Novell выбрала Lift для своего продукта Pulse, и вот что Novell говорит о Lift:
Lift - это такой веб-фреймворк, который позволяет вам как разработчику сконцентрироваться на общей картине. Сильная, выразительная типизация и высокоуровневые функции, такие как встроенная поддержка Comet, позволяют вам сосредоточиться на инновациях, а не на сантехнике. Создание насыщенного, работающего в режиме реального времени веб-приложения, такого как Novell Pulse требует фреймворка с мощью Lift под крышкой.
Итак, Lift - это не просто еще один MVC-фреймворк. Это фреймворк, в основе которого лежат основные принципы проектирования, которые очень хорошо себя зарекомендовали. Это фреймворк, который дает двойное преимущество - безопасность и производительность разработчика. Lift - это фреймворк, который строится послойно и предоставляет разработчику правильный выбор в зависимости от его потребностей... выбор для генерации представлений, выбор для персистентности и т. д.
Scala и Lift дают разработчикам гораздо лучший опыт, чем меланж из XML, аннотаций и других идиом, из которых состоит Spring.