Почему я использовал бы Scala/Lift по Java/Spring? [закрытый]

Я знаю, что этот вопрос немного нерешен, но я смотрел на Scala/Lift как на альтернативу Java/Spring, и интересно, что является реальными преимуществами, которые Scala/Lift имеет по нему. С моей точки зрения и опыта, Аннотаций Java и Spring действительно минимизирует объем кодирования этого, необходимо сделать для приложения. Scala/Lift улучшает это?

151
задан Ivan 23 September 2011 в 20:22
поделиться

7 ответов

Предположим, что мы одинаково хорошо знакомы с Scala и Java, и игнорируем (огромные) языковые различия, за исключением тех, которые относятся к Spring или Lift.

Spring и Lift почти диаметрально противоположны с точки зрения зрелости и целей.

  • Spring примерно на пять лет старше, чем Lift
  • Lift является монолитным и нацелен только на сеть; Spring является модульным и нацелен как на веб-приложения, так и на «обычные» приложения
  • Spring поддерживает множество функций Java EE; Lift игнорирует эти вещи

В одном предложении Spring - это тяжелый вес, а Lift - легкий. При наличии достаточной решимости и ресурсов вы можете перевернуть это с ног на голову, но вам потребуется лот обоих.

Вот конкретные различия, которые запомнились мне после работы с обоими фреймворками. Это не исчерпывающий список, который я все равно не могу составить. Как раз то, что мне показалось наиболее интересным ...

  1. Философия просмотра

    Lift рекомендует размещать некоторые материалы для просмотра в методах сниппетов / действий. Код фрагмента будет особенно усыпан программно сгенерированными элементами формы,

    s,

    s и т. Д.

    Это мощный и полезный инструмент, особенно с учетом того, что Scala имеет встроенный режим XML на уровне языка. Можно написать встроенный XML в методы Scala, включая привязки переменных в фигурных скобках.Это может быть приятно для очень простых XML-сервисов или макетов сервисов - вы можете создать набор действий HTTP-ответа в одном великолепно кратком файле, без шаблонов или дополнительной конфигурации. Обратной стороной является сложность. В зависимости от того, как далеко вы зашли, существует либо нечеткое разделение проблем между представлением и логикой, либо отсутствие разделения.

    Напротив, регулярное использование Spring для веб-приложений обеспечивает четкое разделение между представлением и всем остальным. Я думаю, что Spring поддерживает несколько движков шаблонов, но я использовал JSP только во всём серьёзном. Создание «нечеткого» MVC-дизайна в стиле Lift с помощью JSP было бы безумием. Это хорошо для крупных проектов, когда просто читать и понимать может утомительно.

  2. Выбор объектно-реляционного преобразователя.

    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 и из них.

  3. Конфигурация

    Приложения Lift настраиваются почти полностью с помощью метода класса «Boot» для всего приложения. Другими словами, настройка выполняется с помощью кода Scala. Это идеально подходит для проектов с краткими настройками, и когда человек, выполняющий настройку, может удобно редактировать Scala.

    Spring довольно гибок с точки зрения конфигурации. Множество параметров conf можно управлять либо с помощью конфигурации XML, либо с помощью аннотаций.

  4. Документация

    Документация Лифта молода. Документы Spring довольно зрелые. Нет конкурса.

    Поскольку документы Spring уже хорошо организованы и их легко найти, я рассмотрю найденные мной документы для Lift. Существует четыре основных источника документации Lift: LiftWeb Book , API Docs , группа Google LiftWeb и « Начало работы » . Также есть хороший набор примеров кода, но я бы не стал называть их «документацией» как таковой.

    Документация API неполная. Книга LiftWeb опубликована на деревьях, но она также находится в свободном доступе в Интернете. Он действительно полезен, хотя его явно дидактический стиль временами меня раздражал. Это немного длинно по учебнику и мало по контракту. Spring имеет соответствующее руководство, которого нет у Lift.

    Но у Lift есть хороший набор примеров.Если вам удобно читать код Lift и пример кода (и вы уже хорошо знаете Scala), вы можете решить все в довольно короткие сроки.

Обе концепции убедительны. Существует широкий спектр приложений, в которых вы можете выбрать любое из них и преуспеть.

113
ответ дан 23 November 2019 в 22:14
поделиться

Расширение ваших знаний - всегда стоящая задача :) Я только начал изучать Scala, это влияет на то, как я пишу обычную Java, и я могу сказать, что это было очень полезно, поэтому далеко.

3
ответ дан 23 November 2019 в 22:14
поделиться

Я бы порекомендовал вам проверить игровой фреймворк, он содержит очень интересные идеи и поддерживает разработку на Java и Scala.

11
ответ дан 23 November 2019 в 22:14
поделиться

Просто так. И ради изучения новых подходов к программированию.

10
ответ дан 23 November 2019 в 22:14
поделиться

I пришел в Lift и Scala не на основе Java, так что это не из личного опыта, но я знаю, что многие разработчики Lift считают Scala гораздо более кратким и эффективным языком, чем Java.

7
ответ дан 23 November 2019 в 22:14
поделиться

Ненавижу бросать ваш мир в тупик. Но вы можете использовать Scala, Java, Lift, Spring в одном приложении, и это не будет проблемой.

3
ответ дан 23 November 2019 в 22:14
поделиться

Должен сказать, что я категорически не согласен с ответом Дэна ЛаРокка.

Lift не является монолитным. Он состоит из дискретных элементов. Он не игнорирует элементы J/EE, он поддерживает такие элементы, как JNDI, JTA, JPA и т.д. Тот факт, что вы не вынуждены использовать эти элементы J/EE, является сильным признаком модульного дизайна Lift.

  • Философия взглядов Lift - "позвольте разработчику решать". Lift предлагает механизм шаблонизации, который не допускает никакого логического кода в представлении, механизм представления, основанный на выполнении кода Scala и XML-литералов Scala, и механизм представления, основанный на Scalate. Если вы выбираете механизм шаблонизации XML, то вы выбираете, сколько разметки, если она вообще есть, должно быть в вашей бизнес-логике. Разделение представлений в Lift сильнее, чем все, что может предложить Spring, потому что вы не можете выразить какую-либо бизнес-логику в XML-шаблонах Lift.
  • Философия Lift в отношении объектной ↔ персистентности - "пусть разработчик решает". В Lift есть Mapper, который представляет собой объектно-реляционный маппер в стиле ActiveRecord. Этого вполне достаточно для небольших проектов. Lift поддерживает JPA. Lift имеет абстракцию Record, которая поддерживает перемещение объектов в и из реляционных баз данных, в и из NoSQL хранилищ (Lift включает встроенную поддержку CouchDB и MongoDB, но слои адаптера - это несколько сотен строк кода, так что если вы хотите Cassandra или что-то еще, это не составит большого труда). В принципе, Lift Web Framework не имеет зависимости от того, как объекты материализуются в сессию. Кроме того, циклы сеанса и запроса открыты, поэтому вставка транзакционных крючков в цикл запроса/ответа проста.
  • Философия Lift заключается в том, что "серверная команда должна знать один язык, а не несколько". Это означает, что конфигурация выполняется на языке Scala. Это означает, что нам не пришлось реализовывать 40% языковых конструкций Java в синтаксисе XML для создания гибких опций конфигурации. Это означает, что компилятор проверяет синтаксис и тип конфигурационных данных, так что вы не получите никаких странностей при разборе XML или неправильных данных во время выполнения. Это означает, что вам не нужно иметь IDE, которая понимает особенности аннотаций, которые вы используете в зависимости от используемой библиотеки.
  • Да, документация 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.

229
ответ дан 23 November 2019 в 22:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: