Warszawska Grupa Użytkowników Javy (Warszawa JUG) [1] zaprasza na 71.
spotkanie, które odbędzie się w najbliższy wtorek, 9. listopada o
godzinie 18:00 w sali 5440 Wydziału MIM UW przy ul. Banacha 2 w
Warszawie.
Temat: Sztuczki w językach programowania
Prelegent: Cezary Bartoszuk
Rozwijane obecnie języki programowania pełne są sztuczek: technik,
wzorców, metod lub przepisów, których przyjęło się używać do
osiągnięcia konkretnego celu. Sądzę, że aby poszerzyć swoją wiedzę o
programowaniu warto poznać smaki ciekawych sztuczek stosowanych w
różnych językach programowania.
Pogadankę o "sztuczkach" (jak będę je nazywał ze względu na to, że są
bytami bardzo różnych rodzajów) podzieliłem na trzy zasadniczo różne
części:
1) Typowanie
2) Przepływ danych
3) Przepływ sterowania
W każdej z tych części w sposób dość popularnonaukowy (i w dużej
mierze opierając się na intuicjach) omówię kilka sztuczek jakie
stosowane są w językach programowania. Każda sztuczka będzie miała
charakter informacyjny wraz z krótkim przejrzeniem plusów i minusów
danego rozwiązania.
Do worka ze sztuczkami wrzucę między innymi: funkcje i typy wyższych
rzędów, kontynuacje, jedną lub dwie monady i polimorfizm w różnych
smakach.
Cezary Bartoszuk jest studentem Wydziału Matematyki, Informatyki i
Mechaniki, kierunku informatyka. Interesuje się programowaniem
funkcyjnym, współbieżnością i clean-codem. Zawodowo programista
Pythona.
Planowany czas prezentacji to 1,5h, po których planuje się
15-30-minutową dyskusję.
Wstęp wolny
Zapraszam w imieniu prelegenta i grupy Warszawa JUG!
Jacek
--
Jacek Laskowski
Notatnik Projektanta Java EE - http://jaceklaskowski.pl
--
Otrzymujesz tę wiadomość, ponieważ subskrybujesz grupę dyskusyjną Google o nazwie „Warszawa Java User Group (Warszawa JUG)”.
Aby zamieszczać posty w tej grupie, wyślij e-mail na adres warsza...@googlegroups.com.
Aby anulować subskrypcję tej grupy, wyślij e-mail na adres warszawa-jug...@googlegroups.com.
Aby uzyskać więcej informacji, odwiedź tę grupę pod adresem http://groups.google.com/group/warszawa-jug?hl=pl.
> No i może w takim razie parametryzowalny test... :-)
Rozwiń proszę.
> assertTrue(StringUtilities.isBlank(null));
Rozumiem, że skorzystałeś z assertTrue zamiast po prostu assert, bo
daje co miało być i co jest przy błędzie?
--
Otrzymujesz tę wiadomość, ponieważ subskrybujesz grupę dyskusyjną Google o nazwie "Warszawa Java User Group (Warszawa JUG)".
Aby zamieszczać posty w tej grupie, wyślij e-mail na adres warsza...@googlegroups.com.
Aby anulować subskrypcję tej grupy, wyślij e-mail na adres warszawa-jug...@googlegroups.com.
Aby uzyskać więcej informacji, odwiedź tę grupę pod adresem http://groups.google.com/group/warszawa-jug?hl=pl.
2010/11/9 Michal Margiel <michal....@gmail.com>:
> assertTrue(StringUtilities.isBlank(null));
Rozumiem, że skorzystałeś z assertTrue zamiast po prostu assert, bo
daje co miało być i co jest przy błędzie?
> - "assert" można wyłączyć,
W testach jest *zawsze* włączone. Argument obalony :) I jest tak
stary, jak sam assert :P
> - metody assertXXX z frameworków testowych (junit, fest-assert, hamcrest...)
> tworzą pewnego rodzaju DSL który dużo wygodniej się czyta
Jasne. W ogólności pełna zgoda, ale
assertTrue(StringUtilities.isBlank(null));
vs
assert StringUtilities.isBlank(null);
słabo wypada :)
> - jak sam napisałeś - przy użyciu "assert" nie dostaniesz właściwego
> komunikatu który dostarczy Ci za darmo własciwa metoda z frameworku.
I tu mnie właśnie zastanowiło, dlaczego nie użyłeś assertThat, który
jest w JUnit?!
> assertThat(string.isEmpty()).isTrue();
Dlaczego nie assertThat(string.isEmpty(), is(true)) ? Pytam z czystej
ciekawości, chcąc trochę uszczknąć z Twojego doświadczenia. Poważnie.
> Warszawska Grupa Użytkowników Javy (Warszawa JUG) [1] zaprasza na 71.
> spotkanie, które odbędzie się w najbliższy wtorek, 9. listopada o
> godzinie 18:00 w sali 5440 Wydziału MIM UW przy ul. Banacha 2 w
> Warszawie.
>
> Temat: Sztuczki w językach programowania
> Prelegent: Cezary Bartoszuk
Film już jest gotowy do publikacji. Około 400 MB (czas: 1:50:00) w
formacie flv. Czekam tylko na upload na javatv. Poszłoby na parleys,
ale już wspominałem, że nie potrafię tego ustrojstwa obsługiwać, więc
jak się już znajdzie filimik publicznie, ktoś mi pomoże (= zrobi to za
mnie :))
p.s. Jeśli ktoś ma serwer do użyczenia na film, proszę o kontakt.
No nie. Samo assert nie mówi czego dotyczy asercja. assertTrue jest bardziej określone, a więc lepsze.
A że nie ma w assert nawiasów...
Generalnie skoro piszemy testy to używamy bibliotek testowych. Assert javowe jest do czego innego.
>
>> - jak sam napisałeś - przy użyciu "assert" nie dostaniesz właściwego
>> komunikatu który dostarczy Ci za darmo własciwa metoda z frameworku.
>
> I tu mnie właśnie zastanowiło, dlaczego nie użyłeś assertThat, który
> jest w JUnit?!
>
>> assertThat(string.isEmpty()).isTrue();
>
> Dlaczego nie assertThat(string.isEmpty(), is(true)) ? Pytam z czystej
> ciekawości, chcąc trochę uszczknąć z Twojego doświadczenia. Poważnie.
Są 2 powody:
1) FEST ma lepsze komunikaty w wyjątkach
2) FEST ma wygodniejsze api (ja podobnie jak Michał wolę method chaining od parametrów).
Paweł
>Są 2 powody:
>> - jak sam napisałeś - przy użyciu "assert" nie dostaniesz właściwego
>> komunikatu który dostarczy Ci za darmo własciwa metoda z frameworku.
>
> I tu mnie właśnie zastanowiło, dlaczego nie użyłeś assertThat, który
> jest w JUnit?!
>
>> assertThat(string.isEmpty()).isTrue();
>
> Dlaczego nie assertThat(string.isEmpty(), is(true)) ? Pytam z czystej
> ciekawości, chcąc trochę uszczknąć z Twojego doświadczenia. Poważnie.
1) FEST ma lepsze komunikaty w wyjątkach
2) FEST ma wygodniejsze api (ja podobnie jak Michał wolę method chaining od parametrów).
> Assert javowe jest do czego innego.
Do czego?
Czy nie do sprawdzenia poprawności naszego kodu? Na produkcji jest
wyłączony. Do włączenia wymaga zmiany w JVM - zatrzymanie aplikacji i
ponowne jej uruchomienie, więc odpada, jako narzędzie diagnostyczne.
Hmmm, chyba, gdzieś widziałem możliwość włączania assert
programistycznie, więc można byłoby wyobrazić sobie interfejs
administracyjny, którym włączamy/wyłączamy asserty, np. JMX.
>2010/11/10 Paweł Lipiński <lipinsk...@gmail.com>:
>
>> Assert javowe jest do czego innego.
>
>Do czego?
>
>Czy nie do sprawdzenia poprawności naszego kodu? Na produkcji jest
>wyłączony. Do włączenia wymaga zmiany w JVM - zatrzymanie aplikacji i
>ponowne jej uruchomienie, więc odpada, jako narzędzie diagnostyczne.
>Hmmm, chyba, gdzieś widziałem możliwość włączania assert
>programistycznie, więc można byłoby wyobrazić sobie interfejs
>administracyjny, którym włączamy/wyłączamy asserty, np. JMX.
Wydaje mi się, że w niektórych zastosowaniach jak najbardziej warto
wykorzystać do defensive programming.
Powiedzmy, że liczymy jakąś skomplikowaną operację bankową.
Jasne - mamy testy. Masę testów.
Ale mimo wszystko czasem lepiej się wyłożyć po asercji niż np. pobrac sobie
z konta A i nie przelać na konto B :-)
Tomek
>
>Jacek
>
>
--
pozdrawiam
Tomek Łasica
Do tego assert zawsze rzuca to samo, a festowe (a nawet hamcrestowe) asercje są dużo bardziej dostosowane do różnych przypadków. Popróbuj przez parę dni i poczujesz różnicę...
>
> Czy nie do sprawdzenia poprawności naszego kodu? Na produkcji jest
> wyłączony. Do włączenia wymaga zmiany w JVM - zatrzymanie aplikacji i
> ponowne jej uruchomienie, więc odpada, jako narzędzie diagnostyczne.
> Hmmm, chyba, gdzieś widziałem możliwość włączania assert
> programistycznie, więc można byłoby wyobrazić sobie interfejs
> administracyjny, którym włączamy/wyłączamy asserty, np. JMX.
Jacek! Assert włączony na produkcji? A chcesz w kodzie produkcyjnym obsługiwać AssertionError!?!?!?
Paweł
> Jacek! Assert włączony na produkcji? A chcesz w kodzie produkcyjnym obsługiwać AssertionError!?!?!?
Pytanie "Skąd w ogóle AE na produkcji"? Tutaj widzę zaletę tego błędu.
Inaczej, skoro był testowany, to może właśnie oddzielić
odpowiedzialności komu przyjdzie pisać asserty (swego rodzaju
programming by contract), a komu testy i mieć oba rozwiązania (?) Nie
wiem, jak duży narzut ma assert i tym samy, czy uruchomić aplikację z
-ea na produkcji.
Patrz "appropriate" w Why not provide a full-fledged
design-by-contract facility with preconditions, postconditions and
class invariants, like the one in the Eiffel programming language?
[1]:
"The assert statement is appropriate for nonpublic precondition,
postcondition and class invariant checking. Public precondition
checking should still be performed by checks inside methods that
result in particular, documented exceptions, such as
IllegalArgumentException and IllegalStateException."
[1] http://download.oracle.com/javase/6/docs/technotes/guides/language/assert.html#design-faq-general
Wg mnie chcą bronić złej decyzji projektowej w jezyku. Dla mnie, z punktu widzenia czytelności, łączenie definicji kontraktu z właściwym ciałem metody to pomyłka. Widzę dużo lepsze rozwiązania:
1) A'la eiffel - na zewn. ciała metody
2) Aspekty
3) Testy jednostkowe
ad 1) wymaga zmian w języku, więc na razie odpada;
ad 2) wymaga aspectj'a, więc chyba nie jest rozwiązaniem dla wszystkich;
ad 3) testy i tak mamy (nie?), więc dlaczego nie użyć ich do tego. Część kontraktu metody często jest de facto wymaganiem biznesowym, więc i tak jest w testach.
Paweł
--
http://blog.pragmatists.pl
> Z kolei assert w kodzie zwykłej (nietestowej) metody bada zachowanie
> dla każdego przypadku jaki się pojawi, np. do metody silnia(n) możesz
> zrobić aserta: assert parametr >= 0, ale nie zrobisz assert wynik ==
> silnia(n) - by by zbadać poprawność wyniku tej metody musisz użyć jej
> samej, co jest bez sensu, ale np. assert wynik > parametr jest tu jak
> najbardziej na miejscu (np. wykrywa przepełnienie dla dużych silni).
To mi się b. podoba, ale kiedy się zastanowić, nie różni się niczym od
if (...) return ...;
Momento, czyżby? :)
Gdyby się tak zastanowić, to konstrukcja if (...) return ...; wymaga
określenia, co należałoby zwrócić, a to może być nietrywialne, np. dla
silni mogłoby to być modulo względem największego akceptowanego
parametru.
Ktoś mógłby powiedzieć, że tutaj IllegalArgumentException jest lepszy
od AssertionError, tylko, że oba i tak nie są w publicznym kontrakcie,
więc klapa (zakładając, że -ea jest włączone).
I tak źle, i tak niedobrze.
> Warszawska Grupa Użytkowników Javy (Warszawa JUG) [1] zaprasza na 71.
> spotkanie, które odbędzie się w najbliższy wtorek, 9. listopada o
> godzinie 18:00 w sali 5440 Wydziału MIM UW przy ul. Banacha 2 w
> Warszawie.
>
> Temat: Sztuczki w językach programowania
> Prelegent: Cezary Bartoszuk
Nagranie dostępne na http://javatv.pl:8080/index5.html. Miłego oglądania!
A można prosić o podpięcie slajdów z boku? Można wykorzystać jakiś
gotowy serwis jak slideshare?
Pozdrawiam
--
Łukasz
+ 48 606 323 122 http://www.lenart.org.pl/
Kapituła Javarsovia 2010 http://javarsovia.pl
T.
--
Pozdrawiam,
Bartek Zdanowski
Kapituła Javarsovia 2010 - http://javarsovia.pl
Komitet organizacyjny Warsjawa 2010 - http://warsjawa.pl
Jest tylko jeden, więc łatwo - nie wiem, jak to zrobić. Pisałem o tym
i jedyne, co dostałem spowrotem, to coś ala "U mnie działa". Zależało
mi na szybkim udostępnieniu, a tomi się zgłosił, więc skorzystałem z
możliwości. Jedno nie przekreśla drugiego, a dodatkowo poszerza grono
osób, które mogą wrzucić filmik na parleys. Są chętni? Mogę pomóc,
jeśli wyjaśni mi się cały proces łopatologicznie. Na MBP nie działa -
nie mogę wczytać filmu - klient nie reaguje na wskazanie go :(
> Jak coś robimy, to róbmy to porządnie, bo tak to szkoda czasu.
Nie szkoda czasu, jeśli efektem było szybkie (liczone w dniach, nie
tygodniach, czy m-cach) udostępnienie filmu szerokiej publiczności.
Liczę, że znajdą się chętni na synchronizację ze slajdami i
upublicznienie na parleys.
tia.... ;-)
> W językach funkcyjnych łatwo jest dodać funckje do istniejących typów,
> w językach obiektowych odwrotnie, łatwo jest rozszerzyć istniejące
> typy.
I tutaj jeden z kolejnych plusów Scali: w zależności od problemu, można wybrać albo rozwiązanie rozszerzalne o typy (czyli "tradycyjne" OO) lub funkcje ((sealed) case class-y). Ciekawe swoją drogą w ilu przypadkach rzeczywiście potrzebna jest rozszerzalność w obu kierunkach - przypuszczam że rzadko, ale to bym musiał zdecydowanie dłużej w Scali popisać.
Bo jednak Java zmusza nas do wykorzystania jednego mechanizmu do wszystkiego. Co prowadzi do różnych dziwnych hacków aby ten jedyny słuszny mechanizm obejść ;).
--
Adam Warski
http://www.warski.org
http://www.softwaremill.eu
T.
Chodziło mi o to w ilu przypadkach potrzebna będzie rozszerzalność naraz. Tzn. że masz typ który jednocześnie potrzebujesz rozszerzać łatwo w obu kierunkach. A właśnie w tym że możesz wykorzystać i OOP i FP zależnie od sytuacji widzę zaletę Scali.