Czego programiści Java myśleć Scala? [Zamknięte]

19

Zauważyłem, że obsługa IDE nie jest tak dobra, ale sam język obsługuje funkcjonalnie idiomy programowania o wiele bardziej czysto.

Richard Warburton
źródło
3
Python jest moją religią, więc dbam tylko o to, co Guido myśli o Scali. neopythonic.blogspot.com/2008/11/scala.html
Job
7
Scala jest tak wielki, że język to nie tylko przyciąga wszystkich tych wielkich umysłów społeczność Scala, ale niestety także wiele zazdrosnych nienawidzą, które starają się odnaleźć w zasadzie nic do ataku na język i ludzi go używać.
Soc
@soc: Żeby było jasne: ja nie nienawidzę Scala, a ludzie, którzy nie mogli go używać prawdopodobnie obchodzi co (o nie!) I o tym myśleć. Myślę, że to zbyt skomplikowane. To wszystko. Złożoność może być w porządku dla tych, którzy mają duży mózg. Nie wiem :-)
Joonas Pulakka
3
Niestety, ja po prostu denerwują kiedy ludzie powtarzają mity bez tworzenia kopii zapasowych swoich roszczeń.
soc
2
@soc: Cóż, całe to pytanie jest całkowicie subiektywne, więc każda odpowiedź jest słuszna, czy to mit, czy nie.
Joonas Pulakka,

Odpowiedzi:

18

Programuję Scalę od ponad roku, więc postaram się cofnąć o rok, aby odpowiedzieć na to pytanie.

  • Kod Scala jest bardziej zwięzły niż kod Java (brak setera lub gettera, można wywnioskować wiele informacji o typie)
  • Wbudowanego wsparcia dla XML dosłowny jest bardzo atrakcyjne.
  • Kompatybilność i interoperacyjność biblioteki Java jest wielki
  • Wsparcie dla niektórych idiomów funkcjonalnych jest odświeżający (dla zrozumienia, zamknięcia, funkcje lambda, Mapa, rozkładana, zmniejszyć)
  • Nie wydaje się być cechą fajne, że twórca języka nie chciał obejmować

Punkty powyżej były mniej lub bardziej, co myślę o Scala zanim zacząłem się go uczyć.

W ciągu roku, oto co się dowiedziałem:

  • Kupowanie książki o schodach było świetną inwestycją i pozwoliło mi zaoszczędzić wiele godzin nauki na własną rękę
  • Składnia ma pewne dziwactwa i czasami byłem bardzo zaskoczony, dlaczego coś jest nie tak. Kompromis polega na tym, że gdy znasz, kod jest mniej niepotrzebny i łatwiejszy do odczytania. Zauważ, że nie jest to problemem, jeśli to czytasz, zamiast kodu zapisu.
  • Biblioteka kolekcja w 2,8 to przyjemność. Trudno jest wrócić do jednego Java.
  • Literał XML jest fajny, ale poza podstawowymi rzeczami musiałem sięgnąć do ekosystemu biblioteki Java. Jest to wygodne, choć.
  • Korzystanie z bibliotek Java z Scala jest bardzo łatwe i wygodne. Korzystanie z klas Scala z Java jest nieco bardziej skomplikowane, ale działa.
  • Mam włączone do edycji IntelliJ IDEA społeczności i chociaż nie jest doskonały, że to więcej niż wystarczająco dobre.
  • Twórca język naprawdę myślał o zestaw funkcji i wszystko działa bardzo ładnie razem. Wsparcie obiektowe jest lepsze niż w Javie (z cechami) i można zrobić programowania funkcyjnego.
  • Jest to język, który najwyraźniej niektórzy programiści Java hate z pasją. Dla mnie, to przywrócił radość programowania.
huynhjl
źródło
21

Cóż, myślę, Scala jest zbyt skomplikowane. Czuje się jak C ++, że ma mnóstwo różnych sposobów robienia rzeczy. Niektórzy nazywają to „bogactwem”, „ekspresją” lub „mocą”, ale przebieg może się różnić. W wielu rzeczywistych projektach musiałbyś sztucznie ograniczać, jakich funkcji językowych będziesz używać, a czego nie, aby wszyscy zaangażowani programiści mogli mówić tym samym podzbiorem języka.

Do programowania funkcjonalnego Wolę Clojure , który jest sposób prostszy niż Scala.

Niech święta wojna zacznie ;-)

Joonas Pulakka
źródło
2
Gdyby tylko Rich Hickey troszczył się tak bardzo o .Net, jak o JVM ...
Job
Byłoby pomocne, gdybyś wyjaśnił nieco więcej o tym, co według ciebie jest zbyt skomplikowane.
Richard Warburton,
4
@Richard Warburton: Kwestie złożoności Scali (lub, jak to ujął Martin Odersky, „siła i problem Scali: jego rozszerzalności”) były szeroko dyskutowane na wielu forach. Jedna z takich dyskusji jest tutaj . Nie twierdzę, że ten kompleks == sam w sobie zły . Problem polega na tym, że podczas gdy 1% najzdolniejszych programistów może być w stanie zrobić cuda z Scala, zdecydowana większość po prostu nie będzie „zdobyć”, i że jest to problem dla świata rzeczywistego zużycia. To jak samochód Formuły 1: ogromna większość ludzi po prostu nie będzie w stanie prowadzić takiej bestii.
Joonas Pulakka
2
+1 Dla wspomnieć Clojure jako alternatywy (jeśli chodzi o programowania funkcyjnego).
Oliver Weiler,
Clojure jest świetny, ale czy jest tak wydajny jak Scala? Czy refaktoryzacja jest równie łatwa bez całego tego statycznego pisania? (Refaktoryzacja Pythona jest na przykład dość trudna - napisałem dla niego refaktoryzację).
9000
13

Około rok temu, a ja coraz bardziej sfrustrowany o przyszłość mojego Startup produktów, jeśli ja nadal używać Java, postanowiłem dać Scala spróbować. Byłem już programowanie w JavaScript i Python w momencie, Ruby była również dobrą alternatywą, ale szukałem statycznie wpisywanych języka, najlepiej taki, który może uruchomić na JVM.

Naprawdę starał się jak Scala, naprawdę, ale uważam, że to kod zupełnie brzydkie i trudne do zrozumienia. I zastanawiał się dramatycznie, że jeśli Scala była nasza najlepsza odpowiedź na Java, to ja pewnie przykręcone i skazany na kontynuowanie pracy z językiem nie lubił mimo wszystko ...

Na szczęście, nie zbyt długo potem dowiedziałem się o Fantom . O rany, czy mi się podobało! Dla mnie to było jak Amerykanin Splendor odpowiedzi na niemiecką biurokracją! Jest dopasowana do wymagań byłem dużo bardziej szukają w Scala, ale elegancko . Miał integrację z Vimem , Eclipse i Netbeans , ładny framework internetowy , działające z nim dojrzałe produkty , małą, ale niezwykle pomocną społeczność ... Pisanie dynamiczne i statyczne! Ucieszyłem się!

(Mógłbym kontynuować, ale ten post ma być o Scala, nie Fantom, więc tutaj zatrzymać. Mój preferencji jest oczywiste , to jednak nie ma to po porównując dwa. Nigdy nie mogłem zrozumieć, dlaczego Fantom dostaje tak mało uwagi w porównaniu do Scala. ale widocznie nie jestem jedyną osobą, jeśli słuchać tego podcastu [ mp3 ], aż do końca).

ivo
źródło
9

Kiedy początkowo zajmował się Scala 2 lata temu, wyglądało to obcy i zastraszenia mnie. W pewnym momencie odkryłem, że język rdzeń jest znacznie prostsze niż Java, ale jego składnia i semantyka jest tak elastyczny, że można tworzyć nowe konstrukcje języka podoba, nawet bez funkcji makro. I od tego czasu całkowicie włączone do Scala dla wszystkich moich projektów Java, ponieważ pozwala mi pisać bez zbytniego standardowy kod.

I jak Clojure, ale zdarzają się sytuacje, w których platforma potrzebuje skompilować do kodu bajtowego statycznej (Android, aplety, ...) i jednocześnie można zrobić, w Scala, to tylko tam.

Choć Scala pozwala rozwiązać wiele problemów w sposób funkcjonalny, ja często problemy, gdzie za pomocą klas czuje się bardziej naturalne. To sprawia, że ​​rzeczy nieco bardziej skomplikowane, ale nigdzie w pobliżu zawiłości i bóle C ++.

Największą nagrodą dla mnie, kiedy naprawdę zacząłem uczyć się języka, było to, że mogłem programować tak, jak to zrobiłem w Javie, po prostu bez hałasu (trochę jak po uruchomieniu Groovy), ale ostatecznie chcesz spróbować zanurzyć się głębiej w moc języka - rośnie z wami.

O pytaniu IDE: Po użyciu Emacsa do wszystkiego, wszystkie moje problemy IDE zniknęły :-)

boxofrats
źródło
9

Lubię Scalę z wielu powodów, ale jest jeden, który jest często pomijany: jego prostota.

Scala może nie być tak prosta jak, powiedzmy, Oberon, ale jest o wiele prostsza niż niektóre inne języki. Scala Language Specification jest ~ 160 stron, Java Language Specification jest ~ 600 (tylko język, nie JVM lub bibliotek!), ECMA-334 C # Language Specification (który AFAIK odpowiada podgrupie Visual C # 2.0) jest ~ 440 stron (bez takich elementów, jak wyrażenia zapytania LINQ, wyrażenia lambda, metody rozszerzenia, ogólna ko- i sprzeczność dynamic, opcjonalne argumenty z wartościami domyślnymi, argumenty słów kluczowych var). Nawet obecny projekt dla ECMAScript 5.1 jest większy przy ~ 210 stron. I oczywiście mój własny „domyślny” język, Ruby, którego aktualny ISO Draft waży około ~ 310 stron, które określają jedynie prawie niepotrzebnie mały podzbiór przecięcia Ruby 1.8.6, 1.9.1 i 1.9.2.

Jörg W Mittag
źródło
6
Ciekawym miernikiem złożoności jest liczba stron w specyfikacji językowej. To niesamowite, jak Scala dzieli opinie na ten temat. Nikt nie powie Python jest skomplikowane, C ++ lub jest prosta, ale Scala wydaje się być zarówno :-) np scala-lang.org/node/7431
Joonas Pulakka
Można budować skomplikowane rzeczy z językiem, a niektóre będą wyglądać tak, jakby były językiem - metody o nazwach alnum non, które wyglądają jak przeciążenia operatora, który nie jest, na przykład.
nieznany użytkownik
2
Ilość stron w specyfikacji języka jest straszny sposób porównać złożoność dwóch językach. Podam tylko dwa przykłady: specyfikacja Java jest napisana prawie samouczkiem, podczas gdy specyfikacja Scala jest napisana bardzo zwięźle. Lub inny przykład, C # 2.0 był właściwie mniej więcej tak złożony jak dzisiaj Java, a może nieco bardziej złożony, biorąc pod uwagę „niebezpieczną” maszynerię, delegatów i właściwości. Ale, jak zauważysz, specyfikacja C # 2.0 jest mniejsza niż JLS.
James Iry
1
Teraz Martin Odersky porównał rozmiar formalnej gramatyki języków. To rozsądna miara jednego aspektu złożoności. Jest to jednak uzasadnione, ponieważ gramatyka nie jest tak elastyczna jak angielski. Nawet wtedy trzeba być ostrożnym. Podobnie jak w przypadku zwykłych programów, możesz łatwo rozciągać lub zmniejszać gramatykę, wybierając różne sposoby ich rozplanowania, liczbę różnych produkcji do uwzględnienia, jakie podstawowe klasy postaci należy założyć itp.
James Iry
3
czekaj, co ? Dlaczego miałbyś próbować mierzyć złożoność przy pomocy wielkości specyfikacji? Jej fatalny pomysł.
smartnut007
9

Oto co jest do bani o Scala:

  • Wskaźnik zerowy był bardzo zły pomysł, aby rozpocząć. Hoare nazwał go jego „miliardów dolarów pomyłka”, ale Scala jest jeszcze gorzej. Ma obiektów nazwanych null, null, None, i Nil. null jest do współdziałania z Java. Null jest wskaźnikiem zerowym ze specyfikacji DOM W3C, None jest tym, co null powinno być zastąpione, a Nil jest czymś pustym.

  • Kiedy konstrukcje językowe okazują się hackerskie, winę ponosi zwykle programista, a nie język. W Scala, jednak język rdzeń zawiera już lekcje biblioteczne, których zachowanie jest tylko udokumentowane „To jest hack”. Nie wierzysz w to? Przeszukiwanie scaladoc dla scala.xml.Group.

  • Ostatni not least, Scala jest źle udokumentowane. Prawie żadnej z klas Scala w oficjalnej dokumentacji pochodzi z przykładowym kodem. Scala jest znacznie trudniejsze do nauczenia niż Java i wymaga głębokiej wiedzy w dziedzinie informatyki.

Aby uniknąć pomylić z Scala-hater, tutaj jest to, co kocham o tym:

  • Mam mniej wyjątków. Nigdy nie miałem ClassCastException i bardzo niewielu NullPointerExceptions podczas interakcji z Javą.
  • Kod jest znacznie krótsze i bardziej zwięzłe niż Java
  • Jest wyzwaniem intelektualnym. Java jest jak język dziecka podczas stosunku.

źródło
10
nulljest zerowym wskaźnikiem Java, Nulljest jego „typem”. Nonejest jednym możliwym „stanem” Option[T]kolekcji zawierającej jeden lub zero elementów. Niljest pusta lista. Chociaż chcesz, aby brzmiało to przerażająco, nie jest. Te typy nie są wymienne ani wymienne i zachowują się dokładnie tak, jak powinny.
soc
9

Scala jest złożona. Nie sposób wokół niego! Jego składnia jest bardzo elastyczny i można dostosować na wiele sposobów (przede wszystkim operatorów / notacja infiksowa) - a system typ ma więcej różnych funkcji niż jakikolwiek inny język znam.

Więc rzeczy nie są tak proste, jak np. W Haskell: Klasy typowe, aby objąć je wszystkie.

Jak Scala próbuje umieścić razem programowanie funkcjonalne, OO, programowanie proceduralne i biblioteki Java, jak również własnych pomysłów, w końcu skończyć z dużą ilością pojęć , które w jakiś sposób wydaje się iść „w tym samym kierunku”:

  • wartości niejawne
  • funkcje uwikłane
  • Existentials
  • Symbole wieloznaczne
  • Cechy
  • Interfejsy
  • klasy abstrakcyjne
  • Klasy przypadków
  • typy strukturalne
  • ograniczenia generyczne
  • Zobacz granice
  • Anonimowe typy

Wybór między nimi wydaje się początkowo trudny i można łatwo zastanawiać się, czy udało się znaleźć właściwe rozwiązanie jakiegoś problemu. Nadużywanie hacków jest nawet bardzo łatweimplicit s.

Ale ciekawe jest: Scala działa. To czasami trudno zrozumieć dlaczego (zwłaszcza na zastanawianie się przez to, co niejawne konwersje + spadkowego + ... jakiś przedmiot ma funkcjonalnośćX ), ale nie musisz się tym przejmować przez większość czasu.

Napisz Scala tak proste, jak to możliwe i będzie działać. Nie należy się martwić o wszystko, co jest możliwe, a po prostu wykorzystać to, czego potrzebujesz. A jeśli czegoś potrzebujesz, możesz być pewien, że jakoś Scala ma go;)

Im lepsze wyniki, tym bardziej będziesz mógł dostosować Scalę za pomocą operatorów, implikacji, monad, funky składni ... i wreszcie uzyskać coś zbliżonego do DSL, które idealnie rozwiąże Twój problem.

W końcu zawsze masz możliwość użycia Scali jako znacznie lepszej Java z czystszą, łatwiejszą składnią, wnioskowania o typie i niektórymi funkcjami.

Dario
źródło
1
„przede wszystkim operatorzy notacji / Infix” - tylko, że scala brakuje operatorów. :) To tylko metody.
nieznany użytkownik
6

To doskonały język, który jest prostszy niż Java na wiele sposobów.

Większość ludzi nie podoba, programista Java czy nie, z tych samych powodów, że większość ludzi, programistów czy też nie, nie jak uczyć się nowych języków programowania. Podejrzewam, że większość ludzi, którzy nauczyli się języka programowania, nawet nie jak dowiedział się, że.

Jeśli martwisz się, że język jest tak skomplikowany jak C ++, unikałbym Clojure jak zarazy. Narzekanie, że Scala jest bardziej skomplikowane niż Clojure, stało się argumentem zastępczym dla ludzi, którzy są całkowicie nieświadomi jednego lub obu języków.

Clojure zawiera makra, co oznacza, można zmienić składnię języku za tyle, ile chcesz, co daje nie tylko „mnóstwo różnych sposobów robienia rzeczy”, ale prawie nieskończoną liczbę sposobów robienia rzeczy. Żadna z tej nowej składni, którą programiści tworzą za pomocą makr, nie zostanie udokumentowana w żadnym miejscu specyfikacji języka.

„Ale możemy uniknąć używania makr lub regulować, które z nich są dozwolone w naszym kodzie”, mówisz. Gratulacje, jesteś teraz mieć „sztucznie limitu co język rysy masz zamiar używać, a co nie”, który jest dokładnie to, co babbling idioci, którzy używają Clojure Scala wykorzystywane jako powód unikania Scala na początku.

Josh
źródło
6
Dzięki za Scala vs wejście Clojure, ale jest to co PO i prosząc o naprawdę?
Martin Wickman
Interesujący punkt dotyczy: makr. Nieco niepokojące. Są makra lub podobne dostępne w Scala, czy jest cała „sztucznie ograniczać” rzecz rozpraszać?
Armand
1
To wydaje się być komentarzem do mojej odpowiedzi, a nie odpowiedzią na pierwotne pytanie. Zgadzam się, makra daje nieskończoną moc, więc gdy stosowane źle, ssać. Więc powinniśmy wykorzystywać je w prawo (tylko w razie potrzeby). To nie zmienia faktu, że Clojure język jest jednym z najprostszych istnieje. Scala zdecydowanie nie jest.
Joonas Pulakka
> To nie zmienia faktu, że Clojure język jest jednym z najprostszych jest. <Jest również całkowicie fałszywe, chyba że używasz niektóre metryki jak „liczby konstruktów językowych”. Jeśli korzystasz z czegoś pożytecznego, na przykład do łatwego czytania i pisania programów w języku, Clojure nie jest jednym z najprostszych.
Josh
Więc proszę iść i dać nam dobrą miarą złożoności języka. „Jak łatwo jest czytać i pisać programy w języku” jest całkowicie subiektywne , więc tutaj tak naprawdę nie pomaga. To prawda, wymyślanie użytecznego i obiektywnej metryki może być praktycznie niemożliwe. (Na przykład Jörg W Mittag poniżej używa liczby stron w specyfikacji języka jako miary złożoności. Chociaż obiektywnie, nie jestem pewien, czy to bardzo przydatne.)
Joonas Pulakka
4

Naprawdę podoba mi się bardziej ziarnistych typu biblioteki Scala. Wydaje się, że nowe kolekcje biblioteka była dobrze przemyślana. Lubię też, jak to zmniejsza ilość kodu wymaganego do prostych klas i funkcjonalne koncepcje to dodaje. Wnioskowanie typu jest również bardzo pomocne. Czuje się jak Java bez kół treningowych. Po użyciu C # na chwilę, Scala rzeczywiście czuje się jak konkurenta, z Java nadal użyteczne, ale pozostają w tyle.

Matt H.
źródło
2

Jako programista Java, początkowo znaleźć Scala interesujące. Jednak po dabbling z nim na chwilę (i działa na prawie wszystkich pozytywy / negatywy już wymienionych przez innych), byłem wyjechaliśmy bardzo „meh” w stosunku do niego. Ulepszenia językowe są równoważone niższą dostępnością zestawów narzędzi. Ja po prostu nie mógł pochodzić z jakiegokolwiek powodu, aby przełączyć określającej koniec. To jest dobre, ale to nie jest „lepszy wystarczająco” zrobić sprawę do przełączania. Nie ma to czynnik subiektywny podniecenie albo (jak Clojure wydaje).

Brian Knoblauch
źródło