Зачем мне использовать Scala/Lift над Java / Spring? [закрытый]
Я знаю, что этот вопрос немного открыт, но я смотрел на Scala/Lift как альтернативу Java/Spring, и мне интересно, каковы реальные преимущества, которые Scala/Lift имеет над ним. С моей точки зрения и опыта, аннотации Java и Spring действительно минимизируют количество кодирования, которое вам нужно сделать для приложения. Улучшается ли Scala / Lift?
10 ответов:
предположим, что мы одинаково удобны в Scala и Java и игнорируем (огромные) языковые различия, за исключением того, что они относятся к Spring или Lift.
весна и подъем почти диаметрально противоположны с точки зрения зрелости и целей.
- весна примерно на пять лет старше лифта
- лифт является монолитным и имеет целью только веб; весной является модульной и целей, так и для "обычных" приложений
- Весна поддерживает множество функций Java EE; лифт игнорирует этот материал
в предложении, Весна тяжеловесна и подъем облегченн. С достаточной решимостью и ресурсами вы можете перевернуть это с ног на голову, но вам понадобится много обоих.
здесь конкретные различия, которые застряли в моей голове после работы с обеими платформами. Это не исчерпывающий список, который я не могу составить в любом случае. Только то, что казалось самым интересным мне...
посмотреть в философии
Lift поощряет размещение некоторых материалов представления в методах фрагмента/действия. Фрагмент кода особенно будет посыпан программно сгенерированными элементами формы,
<div>
s,<p>
s и др.это мощно и полезно, тем более что Scala имеет встроенный режим XML на уровне языка. Можно написать XML inline в методах Scala, включая привязки переменных в фигурных скобках. Это может быть восхитительно для очень простых XML-службы или макеты служб-вы можете выбить набор действий HTTP-ответа все в одном великолепно кратком файле, без шаблонов или большой сопутствующей конфигурации. Недостатком является сложность. В зависимости от того, как далеко вы идете, есть либо нечеткое разделение между представлением и логикой, и никакого разделения.
напротив, регулярное использование Spring для веб-приложений обеспечивает сильное разделение между представлением и всем остальным. Я думаю, что весна поддерживает несколько шаблонов двигатели, но я использовал JSP только во всем серьезном. Делать вдохновленный лифтом" нечеткий MVC " дизайн с JSP было бы безумием. Это хорошо для больших проектов, где время просто читать и понимать может быть подавляющим.
Выбор Объектно-Реляционных Карт
встроенный ORM лифта - это "картограф". Есть предстоящая альтернатива под названием "Record", но я думаю, что она все еще считается pre-alpha. В книге LiftWeb есть разделы по использованию как Mapper, так и СПД.
лифт CRUDify функция, прохладно, как это, работает только с Mapper (а не JPA).
конечно, весна поддерживает a доспехи стандартных и / или зрелых технологий баз данных. Ключевое слово "поддерживает". Теоретически, вы можете использовать любой Java ORM с лифтом, так как вы можете вызвать произвольный код Java из Scala. Но Lift действительно поддерживает только Mapper и (в гораздо меньшей степени) JPA. Кроме того, работа с нетривиальным кодом Java в Scala в настоящее время не так гладко, как хотелось бы; используя Java ORM, вы, вероятно, обнаружите, что либо используете коллекции Java и Scala везде, либо конвертируете все коллекции в компоненты Java и из них.
конфигурация
подъемные приложения настраиваются в значительной степени полностью через метод класса "Boot" для всего приложения. Другими словами, конфигурация выполняется с помощью кода Scala. Это идеально подходит для проектов с кратким конфигурации, и когда человек делает настройку удобно редактирования Scala.
весна довольно гибка по отоношению к конфигурации. Многие параметры conf могут управляться либо с помощью конфигурации XML, либо с помощью аннотаций.
документация
документация лифта молода. Весенние документы довольно зрелые. Нет никакого соревнования.
поскольку документы Spring уже хорошо организованы и легко найти, я рассмотрю документы я нашел для лифта. Есть в основном 4 источника лифтовой документации:LiftWeb Book на API Docs, LiftWeb Google group, и "Начало Работы". Есть также хороший набор примеров кода, но я бы не назвал их "документацию", как таковой.
документы API являются неполными. Книга LiftWeb была опубликована на деревьях, но она также свободно доступна в интернете. Это действительно полезно, хотя его явно дидактический стиль временами раздражал меня. Это немного долго на учебник и короткий контракт. Пружина имеет правильную инструкцию, которой не хватает лифту.
но лифт имеет хороший набор примеров. Если вам удобно читать код лифта и пример кода (и вы уже хорошо знаете Scala), вы можете решить все довольно быстро.
обе структуры являются убедительными. Существует широкий спектр приложений, где вы можете выбрать и сделать хорошо.
Я должен сказать, что я категорически не согласен с ответом Дэна Ларока.
лифт не монолитна. Он составлен на дискретных элементах. Он не игнорирует элементы J/EE, он поддерживает подобные JNDI, JTA, JPA и т. д. Тот факт, что вы не вынуждены использовать эти элементы J/EE, является сильным признаком модульной конструкции лифта.
- философия взгляда Lift - это " пусть разработчик решает."Лифт предлагает шаблонный механизм, который не допускает никакой логики код в представлении, механизм представления, основанный на выполнении кода Scala и XML-литералов Scala, и механизм представления, основанный на Scalate. Если вы выберете механизм шаблонов XML, то вы выберете, сколько, если таковые имеются, наценка принадлежит в вашей бизнес-логике. Разделение представлений Lift сильнее, чем все, что может предложить Spring, потому что вы не можете выразить какую-либо бизнес-логику в шаблонах XML Lift.
- философия объекта Lift ↔ Persistence - " пусть разработчик решает." Лифт есть маппер, который является стиль модели объектно-реляционного отображения. Он получает работу для небольших проектов. Лифт СПД поддержки. Lift имеет абстракцию записей, которая поддерживает перемещение объектов в реляционные базы данных и из них, в магазины NoSQL и из них (Lift включает в себя встроенную поддержку CouchDB и MongoDB, но слои адаптера-это несколько сотен строк кода, поэтому, если вы хотите Cassandra или что-то еще, это не много работы, чтобы получить его.) В принципе, поднять веб-фреймворк не имеет зависимость от того, как объекты материализуются в сеанс. Кроме того, циклы сеанса и запроса открыты таким образом, что вставка крючков транзакций в цикл запроса/ответа является простой.
- философия Lift заключается в том, что "команда сервера должна знать один язык, а не несколько языков."Это означает, что конфигурация выполняется через Скала. Это означает, что нам не нужно было реализовывать 40% языковых конструкций Java в синтаксисе XML для создания гибких параметров конфигурации. Это значит, что синтаксис компилятора и тип-проверяет данные конфигурации, поэтому вы не получаете никакого странного синтаксического анализа XML или неверных данных во время выполнения. In означает, что вам не нужно иметь IDE, которые понимают детали аннотаций, которые вы используете, на основе используемой библиотеки.
- да, документация Lift не является его сильной стороной.
с вышесказанным, позвольте мне поговорить о философии дизайна лифта.
я писал Веб-Фреймворк Манифест прежде чем я начал писать лифта. В значительной степени, и в большей степени, чем это верно для любого другого веб-фреймворка, который я знаю, лифт отвечает этим целям.
Lift по своей сути стремится абстрагировать цикл HTTP-запроса/ответа, а не размещать обертки объектов вокруг HTTP-запроса. На практическом уровне это означает, что большинство любых действий, которые пользователь может предпринять (отправка элементов формы, выполнение Ajax и т. д.) представлен GUID в браузере и a функция на сервере. Когда 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 и т. д.
Итак, одна большая разница между лифтом и пружиной заключается в том, что философия лифта GUID, связанная с функцией, имеет двойное преимущество гораздо лучшей безопасности и гораздо лучше производительность разработчиков. Ассоциация функций GUID - > оказалась очень прочной... такая же конструкция работает для обычных форм, ajax, comet, многостраничных мастеров и т. д.
следующая основная часть лифта держит абстракции высокого уровня вокруг как можно дольше. На стороне генерации страницы это означает создание страницы как элементов XHTML и сохранение страницы как XHTML до тех пор, пока не будет передана потоковая передача ответа. Преимущества сопротивление к перекрестному месту ошибки сценариев, возможность перемещения тегов CSS в начало и скриптов в нижнюю часть страницы после того, как страница была составлена, а также возможность переписать страницу на основе целевого браузера. На стороне ввода URL-адреса могут быть переписаны для извлечения параметров (как параметров запроса, так и параметров пути) типобезопасным способом, высокий уровень, проверенные данные безопасности доступны для обработки очень рано в цикле запроса. Например, вот как определить обслуживание отдыха запрос:
serve { case "api" :: "user" :: AsUser(user) :: _ XmlGet _ => <b>{user.name}</b> case "api" :: "user" :: AsUser(user) :: _ JsonGet _ => JStr(user.name) }
используя встроенное сопоставление шаблонов Scala, мы сопоставляем входящий запрос, извлекаем третью часть пути и получаем пользователя, который соответствует этому значению, и даже применяем проверки управления доступом (имеет ли текущий сеанс или запрос разрешения на доступ к данной записи Пользователя). Таким образом, к тому времени, когда экземпляр пользователя попадает в логику приложения, он проверяется.
С этими 2 частями сердечника, подъем имеет большущее преимущество оперируя понятиями обеспеченности. К дайте вам представление о величине безопасности лифта, которая не мешает функциям,Расмус Lerdorg кто сделал безопасность для Yahoo! если бы это сказать о FourSquare (один из сайтов плаката лифта):
четыре звезды на @foursquare - 1-й сайт через некоторое время я внимательно посмотрел на то, что не было ни одной проблемы безопасности (что я мог найти) -- http://twitter.com/rasmus/status/5929904263
в то время, У FourSquare был один инженер, работающий над кодом (не то, чтобы @harryh не был супер-гением), и его основным направлением было переписывание PHP-версии FourSquare, справляясь с еженедельным удвоением трафика.
последняя часть фокуса безопасности лифта-Карта сайта. Это единая система управления доступом, навигации по сайту и меню. Разработчик определяет правила управления доступом для каждой страницы с помощью кода Scala (например,
If(User.loggedIn _)
илиIf(User.superUser _)
) и эти правила контроля доступа применяются перед любой страницей начинается рендеринг. Это очень похоже на Spring Security, за исключением того, что он запечен с самого начала проекта, а правила управления доступом унифицированы с остальной частью приложения, поэтому вам не нужно иметь процесс обновления правил безопасности в XML при изменении URL-адресов или методов, которые вычисляют изменение управления доступом.для того чтобы суммировать до сих пор, общее соображение конструкции подъема дает вам преимущества испеченный в контроле допуска, сопротивлении к обеспеченности верхней части 10 OWASP уязвимости, гораздо лучшая поддержка Ajax и гораздо более высокая производительность разработчиков, чем Spring.
но Lift также дает вам лучшую поддержку Comet любого веб-фреймворка. Вот почему новелл выбрал лифт, чтобы привести их в действие пульс товара и вот что новелл должен сказать о лифте:
лифт-это своего рода веб-фреймворк, который позволяет вам, как разработчику сосредоточьтесь на общей картине. Сильная, выразительная типизация и более высокий уровень такие функции, как встроенная поддержка кометы позволяет вам сосредоточиться на инновациях вместо водопровод. Строительство богатого, в режиме реального времени веб-приложение, такое как Novell Pulse требует рамок с силой Поднимите под одеялом.
Итак, Lift-это не просто еще один фреймворк MVC. Это структура, которая имеет некоторые основные принципы проектирования за ним, которые созрели очень хорошо. Это структура, которая дает двойные преимущества безопасности и производительности разработчика. Lift-это структура, которая построена в слоях и дает разработчику правильный выбор, основанный на их потребностях... выбор для генерации представлений, выбор для сохранения и т. д.
Scala и Lift дают разработчикам гораздо лучший опыт, чем меланж XML, аннотации и другие идиомы, которые составляют Spring.
Я бы рекомендовал вам проверить Play framework, он имеет некоторые очень интересные идеи и поддерживает развитие в Java и Scala
Я сильно изучил использование Lift для недавнего веб-проекта, не будучи большим поклонником Spring MVC. Я не использовал последние версии, но более ранние версии Spring MVC заставили вас прыгать через множество обручей, чтобы запустить веб-приложение. Я был почти продан на лифте, пока не увидел, что лифт может быть очень зависимым от сеанса и потребует "липких сеансов" для правильной работы. Отрывок из http://exploring.liftweb.net/master/index-9.html#sec:Session-Management
пока не будет стандартной технологии репликации сеанса вы все еще можете кластер приложений, используя "липкие сессии". Это меас, что все запросы, относящиеся к сеансу HTTP, должны обрабатываться одним и тем же пользователем узел кластера
поэтому, как только требуется сеанс, пользователь должен быть привязан к этому узлу. Это создает потребность в интеллектуальной балансировке нагрузки и влияет на масштабирование, что не позволило Lift быть решением в моем случае. В итоге я выбрал http://www.playframework.org/ и были очень довольны. Играть стабильно и надежно и очень легко работать.
Я не приходите, чтобы поднять и Scala из фона Java, так что это не из личного опыта, но я знаю, что многие разработчики лифтов считают Scala гораздо более кратким и эффективным языком, чем Java.
расширение ваших знаний всегда стоит усилий :) я только начал изучать Scala, это влияет на то, как я пишу нормальную Java, и я могу сказать, что это было очень полезно до сих пор.
Я ненавижу полностью бросить свой мир для петли. Но вы можете использовать Scala, Java, Lift, Spring в одном приложении, и это не будет проблемой.
давайте рассмотрим, что вы хотите написать приложение. Если вы достойный разработчик, приложение уже должно быть построено в вашем уме. Следующий шаг-узнать, как он работает с помощью кода. Для этого вам нужно передать воображаемое приложение через функцию, которая переводит его в приложение реального мира. Эта функция является языком программирования. Так что
Real app = programming language (imagined app)
поэтому выбор языка очень важен. Так же как и рамки. Здесь есть тонна умных людей, которые посоветуют вам, что выбрать, но в конечном счете, язык / структура, которая лучше всего переводит ваше воображение, должна быть вашим выбором. Так что прототип с обоими и сделать свой выбор.
Что касается меня, я медленно изучаю Scala и поднимаю и люблю его.
но главная проблема-мы не можем сравнить пружины с лифтом. Лифт в основном использовать в качестве фреймворка, а весной использовать как Ди рамок.
Если вы разрабатываете веб-приложение, которое имеет такую большую часть бэкэнда, вы можете использовать lift.
но если ваш разработки веб-приложения, которые имеют некоторые серии бэкэнд,и вы definelty нужно перейти к весне.