Scala

0

Ostatnio napotykam sporo opinii, że Scala jest takim świetnym językiem programowania. Od razu na wstępie zaznaczam, że nie znam tego języka. Zachęcony opiniami postanowiłem zobaczyć co to jest. Odpaliłem tutorial i mocno mnie odrzuciło już na Hello Worldzie: http://www.erudis.pl/pl/node/154

Uważam, że język programowania powinien mieć sztywne reguły pisania. Nie wyobrażam sobie pisania zespołowego w języku, w którym jedną prostą rzecz można napisać na wiele sposobów. Człowiek musi poświęcić więcej czasu na poznanie stylu partnera, a później wiele razy domyślać się w jaki sposób działa dana rzecz. Opcjonalne stawianie średników po zakończeniu instrukcji to jakaś bzdura - nie rozumiem czemu to miałoby służyć, bo chyba nie wygodzie. Gdy napisano, że
obiekt.metoda(parametr)jest równoważne z
obiekt metoda parametrto mi ręce opadły. Po co to komu? Po co w ogóle coś takiego umożliwiać?
Być może wyolbrzymiam, ale takie jest moje pierwsze wrażenie po zetknięciu się ze Scalą. Jest w niej coś tak wartościowego, że można przymknąć oko na ten brak narzuconej dyscypliny?

<font size="2">Jeżeli temat powinien być we Flamewars, to proszę o przeniesienie.</span>

0

Scala nazywa się Scalą bo jest skalowalna, każda metoda jednoargumentowa może być użyta jako operator, nie ma tutaj narzuconych ograniczeń co do operatorów.

...ale zapis for (val i <- 1 to 20) się podoba? 'to' to zwyczajna metoda.

Nie narzekaj, Scala to dosyć przyjemny i potężny język. Może zamiast kiepskiego tutoriala lepiej w sensowną książkę zainwestować?

0

Żeby zainwestować w książkę temat musi mnie zainteresować. Przecież nie kupię książki do FrontPage'a z nadzieją, że może będzie fajnie.
Zapisu, który podałeś do końca nie rozumiem (ogólnie co on robi), ale kumam możliwe zastosowania. Niegłupie.

0

Nooo, po Pythonowemu:

for i in range(1, 20):
0

@wpisałem nick, scala nie jest językiem obiektowym, ale funkcyjnym z elementami obiektowymi zaczerpniętymi z javy.

Składnia języków funkcyjnych ma już to do siebie, że może być dość swobodna. Dzięki takiemu podejściu możliwe jest uzyskanie efektów trudnych do osiągnięcia w inny sposób.

Przypadek ekstremalny - DSL do testów:

myObject should exist

piękny test. Od razu wiadomo o co chodzi. myObiekt powinien istnieć. Spróbuj uzyskać taki efekt w Javie. Czeka cię pisanie interpretera skryptów. Tu wystarczy, że zdefiniujesz odpowiednie operatory i gotowe.

0
Koziołek napisał(a)

@wpisałem nick, scala nie jest językiem obiektowym, ale funkcyjnym z elementami obiektowymi zaczerpniętymi z javy.

Scala jest hybryda obiektowo - funkcyjna. Jest w pelni obiektowym jezykiem, co czyni ja bardziej obiektowa niz Java niz Java, ktora ma prymitywy, statici itp. W Scali wszystko jest obiektem: nie ma prymitywow, nie ma statikow (sa <ort>objekty </ort>singleton), funkcje sa obiektami itp. Tudno wiec zeby nie byla obiektowa a tylko elementy obiektowosci miala zaczerpniete z Javy. Nie gadaj bzdur.

0
Koziołek napisał(a)

Przypadek ekstremalny - DSL do testów:

myObject should exist

Przyklad z d**y wziety. Co zwraca metoda should? Co to jest exist? Jakis implicit czy cos? Co oznacza "obiekt nie istnieje" - ze referencja jest null? Jesli myObject jest null to dostaniesz NPE - tak, w Scali tez mozna dostac nulla. Widac tez ze malo specyfikacji czytasz - slowo "should" nie oznacza koniecznosci - co ma ten test zwrocic? Sory ze sie czepiam, ale bajki wiara opowiada o tej Scali, nie sluzy to temu ciekawemu jezykowi zbyt dobrze...

0

Do autora. Pan Trzy Kropki podal jeden przyklad, ja postaram sie podac inny, aby odpowiedziec na pytanie po co to.
W Scali nie ma operatorow, wszystko to sa metody. Liczby to sa obiekty, np 3 i 4 to obiekty klasy Int. Metody i funkcje w Scali moga miec nazwy skladajace sie z niemal kazdego znaku, i np dla klasy Int metoda jest +. Dzieki temu co kwestionujesz, mozesz zapisac:
val value = 3 + 4
zamiast np
val value = 3.+(4)
Pisales cos z pomoca BigDecimal?
BigDecimal a = new BigDecimal("3");
BigDecimal b = new BigDecimal("4");
BigDecimal c = a.multiply(b);
Ladne?
val a = BigDecimal("3")
val b = BigDecimal("4")
val c = a * b
gdzie * jest metoda klasy BigDecimal (ktora jest klasa case czyli nie wymaga slowka new) i robi dokladnie to samo co w Javie BigDecimal.multiply().
Jednym slowem, przeciazenia operatorow made easy.
Inny przyklad to np konstrukcje kontrolne:
cudak {
jakis kod
}
Czy cudak jest w skladni jezyka, czy jest to funkcja bilbioteczna? Mozesz napisac funkcje ktora sie da tak wywolac, wtedy "jakis kod" zostanie opakowany w funkcje i dany jako parametr funkcji cudak ktora costam z nim zrobi. W ten sposob mozesz latwo tworzyc wspomniane przez Koziolka DSL. Spojrz tez na biblioteke do operacji na XML i podawnaiu zapytan XPath - tam tez to jest wykorzystane, i jest dosc zwiezle.

Scala to trudny jezyk, raczej nie dla poczatkujacych, skomplikowana, elastyczna skladnia przyprawia wiekszosc zatwardzialych Javowcow o zawrot glowy, wymaga przyzwyczajenia. Wiele rzeczy da sie zrobic na wiele sposobow, jak i w Rubym, pewnie kazdy zespol bedzie mial jakies konwencje czy cos. Trzeba jednak wiedziec w ktorym miejscu przestac z wykorzystywaniem tej elastycznosci skladni bo moga powstac liby o kodzie zupelnie nieczytelnym, jak i rowniez narzucajace pewien styl programowania, ktory niekoniecznie musi sie wszystkim podobac.
Osobiscie nauka Scali to bylo dla mnie dosc odswiezajace doswiadczenie (nie jestem jakims multilingwista i z funkcyjnoscia nie mialem wiele stycznosci, tylko nauczelni), polecam jednak sie zapoznac. Swietna ksiazka (dosc sucho napisana, ale konkretnie, wytlumaczone itp) to tzw Staircase book: http://www.artima.com/shop/programming_in_scala.
Pozdro.

1 użytkowników online, w tym zalogowanych: 0, gości: 1