Я зазначав, що підтримка IDE ніде не є такою хорошою, але сама мова підтримує функціональні ідіоми програмування набагато чіткіше.
Я зазначав, що підтримка IDE ніде не є такою хорошою, але сама мова підтримує функціональні ідіоми програмування набагато чіткіше.
Відповіді:
Я програмую Scala вже не один рік, тому спробую повернути себе на рік, щоб відповісти на це питання.
Наведені вище точки були більш-менш те, що я думав про Скалу, перш ніж почати її вивчати.
Протягом року я дізнався ось що:
Ну, я вважаю, Скала занадто складна. C ++ відчуває себе таким, що має безліч різноманітних способів робити речі. Дехто би назвав це "багатством", "виразністю" або "силою", але ваш пробіг може відрізнятися. У багатьох реальних проектах вам доведеться штучно обмежувати, які мовні функції ви збираєтесь використовувати, а які ні, щоб усі розробники могли говорити однаковою мовою.
Для функціонального програмування я віддаю перевагу Clojure , який простіше, ніж Scala.
Нехай почнеться свята війна ;-)
Приблизно рік тому, коли я все більше і більше засмучувався щодо майбутнього продуктів мого стартапу, якщо я продовжую використовувати Java, я вирішив спробувати Scala. Я вже програмував на JavaScript і Python у той час, Ruby також була гарною альтернативою, але я шукав статично введений мову, бажано той, який міг би працювати на JVM.
Мені справді було спробувати подобатися Скала, мені це справді вдалося, але я виявив, що це код абсолютно некрасивий і важкий для розуміння. Я різко замислився, що якщо Скала була нашою найкращою відповіддю на Яву, то мене, безумовно, накрутили і засудили продовжувати працювати з мовою, яка мені не сподобалася зрештою ...
На щастя, не надто довго після цього я дізнався про Fantom . О людино, я любив це! Для мене це було як пишна відповідь американця німецькій бюрократії! Це відповідало вимогам, які я шукав у Scala, але набагато елегантніше . Він мав інтеграцію Vim , Eclipse та Netbeans , хороший веб-фреймворк , зрілі продукти, що працюють з ним, невелике, але неймовірно корисне співтовариство ... Динамічне та статичне введення тексту! Я зрадів!
(Я міг би продовжувати, але ця публікація має на увазі про Скалу, а не про Фантом, тому я зупиняюся тут. Мої переваги зрозумілі , все-таки є цей пост, порівнюючи обидва. Я ніколи не міг зрозуміти, чому Фантому приділяється так мало уваги в порівнянні зі Скалою. Але, мабуть, я не єдиний, якщо ви слухаєте цей подкаст [ mp3 ] до кінця.)
Коли я спочатку поспілкувався зі Скалою 2 роки тому, це виглядало мені чуже і залякало. Якось я виявив, що основна мова насправді набагато простіша за Java, але її синтаксис та семантика є настільки гнучкими, що ви можете створювати нові мовні конструкції, як він, навіть без макро-функції. З тих пір я повністю перейшов на Scala для всіх своїх Java-проектів, тому що це дозволяє мені писати без зайвого кодового коду.
Мені подобається Clojure, але бувають ситуації, коли платформа потребує того, щоб ти зібрав статичний байт-код (Android, аплети, ...), і хоча ти можеш це зробити, у Scala це просто там.
Хоча Scala дозволяє вам вирішувати багато проблем у функціональний спосіб, я часто знаходжу проблеми, коли використання класів відчуває себе більш природним. Це робить речі дещо складнішими, але ніде не буває складнощів і болю C ++.
Найбільше для мене, коли я справді почав вивчати мову, - це те, що я міг програмувати саме на Java, просто без шуму (трішки, як коли ти починаєш Groovy), але врешті ти хочеш спробувати зануритися глибше у владу мови - з вами росте.
Про питання IDE: Після використання Emacs для всіх, всі мої проблеми IDE пішли :-)
Мені подобається Скала з багатьох причин, але є одна, яку часто не помічають: її простота.
Скала може бути не такою простою, як, скажімо, Оберон, але вона набагато простіша, ніж деякі інші мови. Специфікація мови Scala становить ~ 160 сторінок, специфікація мови Java становить ~ 600 (лише мова, а не JVM або бібліотеки!), Специфікація мови ECMA-334 C # (якій AFAIK відповідає підмножині Visual C # 2.0): ~ 440 сторінок (це не такі речі, як розуміння запитів LINQ, лямбда-вирази, методи розширення, загальне спів- та протиріччя dynamic
, необов'язкові аргументи зі значеннями за замовчуванням, аргументи ключових слів var
). Навіть поточний проект для ECMAScript 5.1 є більшим на ~ 210 сторінок. І звичайно моя власна мова "за замовчуванням", Ruby, чия нинішня чернетка ISO важить приблизно ~ 310 сторінок, де лише вказано майже неприйнятно крихітний підмножина перетину Ruby 1.8.6, 1.9.1 та 1.9.2.
Ось, що гарно про Scala:
Нульовий покажчик був для цього досить поганою ідеєю. Хоар назвав це своєю "помилкою в мільярд доларів", але у Скали ще гірше. У ньому є об'єкти з ім'ям null, Null, None та Nil. null призначений для сумісності з Java. Null є нульовим покажчиком специфікації W3C DOM, None - це те, що null повинно було бути замінено, а Nil - це порожнє щось.
Коли мовні конструкції виявляються хиткими, зазвичай винен програміст, а не мова. Однак у Scala основна мова вже містить бібліотечні класи, єдиною документально підтвердженою поведінкою є "Це хакер". Не вірите? Шукайте у scaladoc для scala.xml.Group.
Не в останню чергу, Scala погано задокументований. Навряд чи будь-який з класів шкали в офіційній документації постачається з прикладом коду. Scala набагато складніше в навчанні, ніж Java, і вимагає глибоких знань з інформатики.
Щоб не помилитися з ненависником Скали, ось що я люблю в цьому:
null
є нульовим покажчиком Java, Null
є його "типом". None
є одним із можливих "станів" Option[T]
колекції з одним або нульовими елементами. Nil
це порожній список. Хоча ви хочете, щоб це звучало страшно, це не так. Ці типи не є замінними або взаємозамінними один з одним і поводяться так, як слід робити.
Скала є складною. Ніякого шляху! Його синтаксис є надзвичайно гнучким і може бути налаштований різними способами (перш за все операторами / інфіксацією) - і система типів має більше різних можливостей, ніж будь-яка інша мова, яку я знаю.
Тому все не так прямо, як, наприклад, у Haskell: Typeclasses, щоб охопити їх усіх.
Коли Scala намагається зібрати функціональне програмування, OO, процедурне програмування та бібліотеки java, а також власні ідеї, ми нарешті закінчуємо безліччю концепцій, які так чи інакше йдуть "в тому ж напрямку":
Вибір серед них здається важким спочатку, і можна легко задуматися, чи знайшов правильне рішення якоїсь проблеми. Зробити хакіти можна навіть легко, зловживаючи implicit
s.
Але цікаве: Скала працює. Іноді важко зрозуміти, чому (особливо з'ясовувати, через які неявні перетворення + успадкування + ... якийсь об'єкт має функціональністьX
), але вам не доведеться турбуватися про це більшість разів.
Напишіть Scala максимально прямо, і це спрацює. Не плутайте все можливе, а просто використовуйте те, що вам потрібно. І якщо вам щось потрібно, ви можете бути впевнені, що у Скали це якось є;)
І чим краще ви отримаєте, тим більше зможете налаштувати Scala за допомогою операторів, імпліцитів, монад, фанк-синтаксису ... і нарешті отримати щось наближене до DSL, що чудово вирішить вашу проблему.
Зрештою, у вас завжди є можливість просто використовувати Scala як набагато кращу Java з чистішим, простішим синтаксисом, висновком типу та деякими функціональними функціями.
Це відмінна мова, яка багато в чому простіша, ніж Java.
Більшість людей не сподобається, програміст Java чи ні, з тих самих причин, що більшість людей, програмістів чи ні, не люблять вивчати нові мови програмування. Я підозрюю, що більшість людей, які вивчали мову програмування, навіть не любили цього вивчати.
Якщо ви турбуєтесь про те, щоб мова була такою складною, як C ++, я б уникнув Clojure, як чума. Хоча, що Скала є складнішим, ніж Clojure, став аргументом для людей, які абсолютно неосвічені щодо однієї або обох мов.
У Clojure є макроси, а це означає, що ви можете змінити синтаксис мови скільки завгодно, даючи вам не просто "безліч різних способів робити речі", а майже нескінченну кількість способів робити речі. І жоден із цього нового синтаксису, який створюють програмісти за допомогою макросів, не буде задокументовано в будь-якому місці мовної специфікації.
"Але ми можемо уникати використання макросів або регулювати, які з них дозволені в нашому коді", - ви кажете. Вітаємо, тепер у вас є "штучно обмежувати мовні функції, які ви збираєтеся використовувати, а що ні", саме це лелекаючі ідіоти, які використовують Clojure of Scala, стали причиною того, щоб уникнути Scala для початку.
Мені дуже подобаються більш деталізовані типи бібліотеки Scala. Схоже, нова бібліотека колекцій була продумана. Мені також подобається, як це зменшує кількість коду, необхідного для простих класів, та функціональні концепції, які він додає. Його корисний висновок також дуже корисний. Відчувається, що Java без навчальних коліс. Після використання C # деякий час, Scala насправді відчуває себе конкурентом, а Java все ще корисна, але залишається позаду.
Як Java-програміст, я спочатку вважав Скалу цікавою. Однак, після того, як на деякий час поспілкувався з цим (і натрапив на майже всі позитиви / негативи, які вже перераховані іншими), я залишився відчувати себе дуже "мех" щодо цього. Мовні вдосконалення компенсуються меншою доступністю наборів інструментів. Я просто не міг придумати жодної чіткої причини переключитися. Це добре, але це не "краще", щоб зробити справу для перемикання. Не має і цього суб'єктивного чинника збудження (як, здається, Clojure).