Чому я використовую Scala / Lift через Java / Spring? [зачинено]


151

Я знаю, що це питання трохи відкрите, але я розглядав Scala / Lift як альтернативу Java / Spring, і мені цікаво, які реальні переваги має Scala / Lift над цим. З моєї точки зору та досвіду, Java Annotations і Spring дійсно мінімізує кількість кодування, яке потрібно зробити для програми. Чи покращується Scala / Lift на цьому?


Питання занадто старе. Але тепер питання буде "Чому я повинен використовувати Scala / Play через XYX", і є багато вагомих причин. Я перейшов до Play і ніколи не оглядався.
Jus12

Відповіді:


113

Припустимо, нам однаково комфортно в Scala та Java, і ігноруємо (величезні) мовні відмінності, за винятком випадків, коли вони стосуються Spring або Lift.

Весна і підйом майже діаметрально протилежні з точки зору зрілості та цілей.

  • Весна приблизно на п’ять років старша за Ліфт
  • Підйомник монолітний і націлений тільки на павутину; Весна є модульною і націлена як на Інтернет, так і на "звичайні" програми
  • Spring підтримує безліч функцій Java EE; Ліфт ігнорує ці речі

У реченні Весна важка, а Підйом - легкий. З достатньою рішучістю та ресурсами ви можете повернути це на голову, але вам потрібно буде дуже багато обох.

Ось конкретні відмінності, які застрягли в моїй свідомості після роботи з обома рамками. Це не вичерпний список, який я ніяк не можу скласти. Тільки те, що мені здавалося найцікавішим ...

  1. Переглянути філософію

    Ліфт заохочує розміщення деякого оглядового матеріалу в методах фрагментів / дій. Код фрагмента, особливо, буде посипаний програмно створеними елементами форми, <div>s, <p>s тощо.

    Це є потужним та корисним, тим більше, що Scala має вбудований режим мови на рівні мови XML. Можна записувати XML inline методами Scala, включаючи змінні прив'язки у дужках. Це може бути приємним для дуже простих XML-сервісів або макетів сервісів - ви можете вибухнути з набору дій HTTP-відповіді все в одному чудово короткому файлі, без шаблонів або великої кількості конфігурації супутника. Мінусом є складність. Залежно від того, наскільки далеко ви пройдете, існує або нечітке розділення проблем між поглядом і логікою, або немає розлуки.

    На відміну від цього, регулярне використання Spring для веб-сайтів забезпечує сильний розрив між поданням та всім іншим. Я думаю, що Spring підтримує декілька двигунів-шаблонів, але я використовував JSP лише в чомусь серйозному. Зробити натхненний ліфт "нечіткий MVC" дизайн з JSP було б безумством. Це гарна річ у великих проектах, де час просто читати та розуміти може бути величезним.

  2. Об'єктно-реляційний вибір Mapper

    Вбудований ORM ліфта - це "Mapper". Існує альтернатива під назвою "Записати", але я вважаю, що вона все ще вважається пре-альфою. У книзі LiftWeb є розділи про використання як Mapper, так і JPA.

    Функція CRUDify Lift , як не круто, працює лише з Mapper (а не JPA).

    Звичайно, Spring підтримує безліч стандартних та / або зрілих технологій баз даних . Оперативне слово є "опори". Теоретично ви можете використовувати будь-який Java ORM з Lift, оскільки ви можете викликати довільний код Java від Scala. Але Lift реально підтримує Mapper та (значно меншу міру) JPA. Крім того, робота з нетривіальним кодом Java в Scala в даний час не настільки безпроблемна, як це могло б хотіти; використовуючи Java ORM, ви, ймовірно, опинитесь або з використанням колекцій Java і Scala скрізь, або перетворять усі колекції в компоненти Java і з них.

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

    Програми Lift налаштовані майже повністю за допомогою методу загальнонаціонального класу "Boot". Іншими словами, конфігурація здійснюється за допомогою коду Scala. Це ідеально підходить для проектів із короткими конфігураціями, і коли людині, яка здійснює налаштування, зручно редагувати Scala.

    Весна досить гнучка з точки зору конфігурації. Багато конфігураційних параметрів можна керувати або через конфігурацію XML, або примітки.

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

    Документація ліфта молода. Документи весни досить зрілі. Конкурсу немає.

    Оскільки документи Весни вже добре організовані і їх легко знайти, я перегляну документи, які знайшов для Lift. В основному є 4 джерела документації щодо підйому: LiftWeb Book , API Документи , група Google LiftWeb та " Початок роботи ". Також є хороший набір прикладів коду, але я не називав би їх "документацією".

    Документи API неповні. Книга LiftWeb була опублікована на деревах, але вона також вільно доступна в Інтернеті. Це дійсно корисно, хоча дивно-дидактичний стиль часом мене дратував. Це трохи довгий підручник і короткий контракт. Весна має належну інструкцію, якої не вистачає підйомника.

    Але у ліфтів є приємний набір прикладів. Якщо вам зручно читати код підйому та приклад коду (а ви вже добре знаєте Scala), ви можете розібратися в досить короткому порядку.

Обидві рамки є переконливими. Існує широкий спектр програм, де ви можете обирати будь-які та робити добре.


10
Хороша відповідь, одна з яких я не погоджуюсь, хоч така: Весна у важкій вазі. У нього широкий спектр хорошого APIS і нав'язує певні структурні способи роботи, необхідні для того, щоб досягти хорошого результату, але в порівнянні з матеріалами J2EE він спочатку замінив це набагато легше рішення. Звичайно "легкість" в очах глядача, тому це, безумовно, суб'єктивний аргумент. Тільки мої 2 копійки тоді.
Брайан

3
Хороша відповідь, дуже об'єктивна. Ліфт робить занадто багато на перший погляд розумних речей, які дуже дурні. Переміщення логіки сторінки до бекенда, змішування HTML із кодом шкали, що гірше, ніж контрольні теги всередині шаблону сторінки. Я не знаю, чому вони це зробили, можливо, вони думають, що Scala повинна обробляти XML приголомшливо швидко. "Поточний посібник з підйому" - це найгірша технологічна книга, яку я коли-небудь читав.
Сойєр

Я не такий знайомий з ліфтом, як хотів би бути. На вашу думку, наскільки складно було б зробити обгортку для завантажувального об'єкта, який замість цього зчитує налаштування з файлу xml? Перше моє враження: так як scala так добре обробляє xml, це не буде надзвичайно складно.
Ape-inago

Сойєр, той факт, що ви можете змішати HTML з кодом шкали, не говорить про те, що вам потрібно. Використання фрагментів розумним чином відокремить HTML і код Scala. Але ей, продовжуй використовувати свої контрольні теги;)
Алебон

1
@Dan, Чи є якісь оновлення, коли Lift удвічі старший, ніж це було вперше?
Pacerier

229

Треба сказати, що я категорично не згоден з відповіддю Дена Ларока.

Підйом не монолітний. Він складається на дискретних елементах. Він не ігнорує елементи J / EE, він підтримує подібність JNDI, JTA, JPA тощо. Те, що ви не змушені використовувати ці елементи J / EE, є яскравим свідченням модульної конструкції Lift.

  • Філософія погляду Lift - це "нехай розробник вирішує". Lift пропонує механізм шаблонування, який не допускає жодного логічного коду у представленні, механізм перегляду, заснований на виконанні коду Scala та XML-літералах Scala, та механізм перегляду на основі Scalate . Якщо ви вибрали механізм шаблонів XML, то ви виберете, скільки (якщо є) надбавки належить вашій бізнес-логіці. Відокремлення підйому Lift є сильнішим за все, що може запропонувати Весна, оскільки ви не можете висловити будь-яку ділову логіку в XML-шаблонах Lift.
  • Об'єкт Lift philosophy Філософія стійкості - це "нехай розробник вирішує". У ліфті є Mapper, який є реляційним картографічним об'єктом у стилі ActiveRecord. Це робить роботу для малих проектів. Підтримка підтримки JPA. У ліфті є абстракція записів, яка підтримує перевезення об'єктів в реляційні бази даних і в них, в і з магазинів NoSQL (Lift включає в себе вбудовану підтримку CouchDB і MongoDB, але шари адаптерів - це кілька сотень рядків коду, тому якщо ви хочете, щоб Cassandra або щось інше, це не так багато роботи, щоб отримати його.) В основному, Підняття веб-рамки не залежить від того, як об’єкти матеріалізуються на сеанс. Крім того, цикли сеансу та запиту відкриті таким чином, що вставити гачки транзакцій у цикл запит / відповідь просто.
  • Філософія Lift полягає в тому, що "серверна команда повинна знати одну мову, а не кілька мов". Це означає, що конфігурація здійснюється через Scala. Це означає, що нам не довелося реалізовувати 40% мовних конструкцій Java в синтаксисі XML, щоб створити гнучкі параметри конфігурації. Це означає, що синтаксис і тип компілятора перевіряє конфігураційні дані, щоб у вас не було ніякого дивного розбору XML або неправильних даних під час виконання. Це означає, що вам не потрібно мати IDE, які розуміють деталі приміток, які ви використовуєте, на основі бібліотеки, яку ви використовуєте.
  • Так, документація Lift не є її сильною стороною.

Якщо говорити вище, дозвольте мені поговорити про філософію дизайну Lift.

Я писав маніфест Web Framework, перш ніж почав писати Lift. Значною мірою, і в більшій мірі, ніж це стосується будь-яких інших веб-рамок, про які я знаю, Lift відповідає цим цілям.

Lift в своїй основі прагне абстрагувати цикл запиту / відповіді HTTP, а не розміщувати обгортки об'єктів навколо HTTP-запиту. На практичному рівні це означає, що більшість будь-яких дій, які може здійснити користувач (подання елементів форми, виконання Ajax тощо), представлені GUID у браузері та функцією на сервері. Коли GUID представлений як частина HTTP-запиту, функція застосовується (називається) із наданими параметрами. Оскільки GUID важко передбачити та залежно від сеансу, повторні атаки та багато атак з підстановкою параметрів набагато складніше з Lift, ніж більшість інших веб-фреймів, включаючи Spring. Це також означає, що розробники є більш продуктивними, оскільки вони зосереджуються на діях користувача та бізнес-логіці, пов'язаній з діями користувача, а не на упаковці та розпакуванні HTTP-запиту.

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 -> Function виявилася дуже довговічною ... та сама конструкція працює для нормальних форм, аякса, комети, майстрів на багато сторінок тощо.

Наступним основним твором Ліфта є збереження високих абстракцій навколо якомога довше. Що стосується покоління сторінки, це означає побудувати сторінку як 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, ми узгоджуємо вхідний запит, витягуємо третю частину шляху і отримуємо Користувача, що відповідає цьому значенню, і навіть застосовуємо перевірки контролю доступу (чи має поточний сеанс чи запит дозволу на доступ до заданої Запис користувача). Отже, до моменту, коли екземпляр користувача потрапляє у логіку програми, він перевіряється.

З цими двома основними елементами Lift має величезну перевагу з точки зору безпеки. Щоб дати вам уявлення про величину безпеки Lift, яка не заважає можливостям, Расмус Лердорг, який зробив безпеку для Yahoo! мав це сказати про FourSquare (один із сайтів для дітей, що займаються плакатами Lift):

Чотири зірки на @foursquare - 1-й сайт через деякий час, я добре роздивився, що не було жодної проблеми безпеки (яку я міг знайти) - http://twitter.com/rasmus/status/5929904263

У той час у FourSquare був один інженер, який працював над кодом (не те, що @harryh не супергеній), і його головна увага була переписування PHP-версії FourSquare під час подолання подвоєння трафіку.

Остання частина фокусу безпеки на ліфті - SiteMap. Це єдиний контроль доступу, навігація по сайту та система меню. Розробник визначає правила контролю доступу для кожної сторінки за допомогою коду Scala (наприклад, If(User.loggedIn _)або If(User.superUser _)), і ці правила контролю доступу застосовуються до початку будь-якої візуалізації сторінки. Це дуже схоже на Spring Security, за винятком того, що він створений з початку проекту, а правила контролю доступу уніфіковані з рештою програми, тому вам не потрібно мати процес оновлення правил безпеки в XML, коли URL-адреси зміни або методи, що обчислюють зміни доступу.

Підводячи підсумок до цього часу, філософія дизайну Lift дає вам переваги від контролю доступу, стійкості до вразливих версій OWASP, що впадає в топ 10, набагато краща підтримка Ajax та набагато вища продуктивність розробників, ніж у Spring.

Але Lift також надає вам найкращу підтримку Comet будь-якої веб-рамки навколо. Ось чому Novell обрав Lift для живлення свого продукту Pulse, і ось що Novell може сказати про Lift:

Lift - це така веб-структура, яка дозволяє вам як розробнику зосередитись на великій картині. Сильні, виразні функції набору тексту та вищого рівня, такі як вбудована підтримка Comet, дозволяють зосередитись на інноваціях замість сантехніки. Для створення розгалуженого веб-додатку в реальному часі, такого як Novell Pulse, потрібна основа з потужністю Lift під кришками.

Отже, Lift - це не просто ще одна рамка MVC. Це рамка, яка має деякі основні принципи дизайну, які визріли дуже добре. Це рамка, яка дає подвійні переваги безпеки та продуктивності розробника. Lift - це структура, яка побудована в шарах і дає розробникові правильний вибір залежно від їх потреб ... вибір для генерації перегляду, вибір для стійкості тощо.

Scala і Lift надають розробникам набагато кращий досвід, ніж меланж XML, анотацій та інших ідіом, які складають Весну.


2
Заархівована версія blog.lostlake.org/index.php?/archives/16-Web-Framework-Manifesto.html доступна за адресою replay.web.archive.org/20070220231839/http://blog.lostlake.org/…
Алан Гехт

1
Ти мав мене у вродженій підтримці MongoDB ... Я в
Еран Медан

8
Я пишу webapps з середини 90-х. Я використовував Perl, Java, Seam, JSP та величезну партію інших. Усі, кого я знаю, хто використовує весну, скаржаться на труднощі в правильному налаштуванні конфігурацій та залежностей, на кошмари мавану тощо. Я почав користуватися Lift у проекті кілька тижнів тому, і я абсолютно вражений. Це найперший фреймворк (і мова), який я використовував там, де все працює майже без зусиль. Наразі я написав десятки функцій у своєму додатку і постійно дивуюсь тому, як швидко я все зрозумію ... навіть із доречними документами та обмеженим розумінням Scala. Бачити - вірити.
Тоні К.

@TonyK. Напевно, весна важка, але вона окупиться, якщо веб-додаток буде змінено набагато пізніше, оскільки набагато простіше рефактор / розширення з Spring. ІМХО, це залежить. Я використовував деякі інші рамки, як-от Grails, для невеликих проектів, і я думаю, що це ідеально для цього - але для того, щоб щось пізніше змінити, я б пішов з Spring.
Хоанг Лонг

7
@ HoàngLong Існує багато підходів до складності еволюції програмного забезпечення. Я просто констатую свій досвід: Java демонструє вік як мову, як і побудовані на ній рамки. Час еволюціонувати до речей, які є більш виразними та потужними без усякого шаленого шаблону та конфігурації.
Тоні К.

11

Я б рекомендував вам перевірити програму play, вона має дуже цікаві ідеї та підтримує розвиток в Java та Scala


2
Я перевірив Play. Я нічого не бачив, окрім вбудованого перезавантаження класу, щоб рекомендувати це, і з безкоштовною ліцензією Scala JRebel ви отримуєте це з Lift.
Тоні К.

10

Задля розваги. І заради вивчення нових підходів до програмування.


10

Я наполегливо розглядав можливість використання Lift для недавнього веб-проекту, не будучи великим шанувальником Spring MVC. Я не використовував останні версії, але більш ранні версії Spring MVC змусили вас перестрибувати безліч обручів, щоб запустити веб-додаток. Мене майже продали на Lift, поки я не побачив, що Ліфт може залежати від сеансу, і для коректної роботи потрібні «липкі сеанси». Витяг з http://exploring.liftweb.net/master/index-9.html#sec:Session-Management

Поки не існує стандартної технології реплікації сеансу, ви все ще можете кластеризувати додаток, використовуючи "липкий сеанс". Це означає, що всі запити, що стосуються сеансу HTTP, повинні оброблятися тим же вузлом кластера

Отже, як тільки потрібна сесія, користувач повинен буде прив’язати до цього вузла. Це створює потребу в інтелектуальному балансуванні навантаження і впливає на масштабування, що не дозволило Lift бути рішенням у моєму випадку. Я закінчив вибір http://www.playframework.org/ і був дуже задоволений. До цих пір гра була стабільною та надійною, з нею дуже легко працювати.


7

Я не прийшов до Lift та Scala з Java, тому це не з особистого досвіду, але я знаю, що багато розробників Lift вважають Scala набагато більш лаконічною та ефективною мовою, ніж Java.


3

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


3

Я ненавиджу повністю кинути твій світ за петлю. Але ви можете використовувати Scala, Java, Lift, Spring в одному додатку, і це не буде проблемою.


0

На мою скромну думку, важлива уява.

Розглянемо, що ви хочете написати додаток. Якщо ви гідний розробник, додаток має бути вже побудовано на вашому розумі. Наступний крок - дізнатися, як це працює за допомогою коду. Для цього вам потрібно передати уявлену програму через функцію, яка переводить її в додаток у реальному світі. Ця функція є мовою програмування. Так

Real app = programming language (imagined app)

Тож вибір мови важливий. Так само і в рамках. Тут є маса розумних людей, які підкажуть, що вибрати, але в кінцевому підсумку мова / рамки, які найкраще перекладають вашу уяву, повинні стати вашим вибором. Тому прототип з обома і зробіть свій вибір.

Щодо мене, я повільно вивчаю Скалу і піднімаю і люблю це.


0

Але головна проблема - ми не можемо порівняти весну з підйомом. Ліфт в основному використовується як рамки інтерфейсу, а Spring використовується як рамка DI.
Якщо ви розробляєте веб-додаток, у якого є стільки задніх днів, ви впевнені, що можете скористатися ліфтом.
але якщо у вашому веб-додатку, що розвивається, у якому є кілька задніх рядів, і ви визначаєте, потрібно йти навесні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.