Thursday, June 19, 2014

2014-06-12 Clean Code Episode 13, The Dependency Inversion Principle

Za nami kolejna z zasad SOLID - zasada odwracania zależności. To już ostatnia zasada z tej grupy, ale obiecujemy, że to nie koniec spotkań z wujkiem Bobem!
  1. Single responsibility principle
  2. Open/closed principle
  3. Liskov substitution principle
  4. Interface segregation principle
  5. Dependency inversion principle
Pogłębienie naszej wiedzy było możliwe dzięki firmie Transition Technologies, która sponsorowała odcinek. Na początku Rafał zaprezentował firmę - krótko, za to treściwie.

Wujek Bob wrócił wspomnieniami do końca lat 70 XX wieku - czasu kiedy wpadł na pomysł odwrócenia zależności. Była to epoka procesorów 8085 z 32kB RAM-u i 32kB ROM-u. Wyobrażacie to sobie?!
Wujek bob nawet to pamięta


O co chodzi z tym odwracaniem? 
Żeby to zrozumieć przyda nam się jakiś trywialny (i dość mierny) przykład - DI(los). Odwróciliśmy sobie SOLID i powstało coś w miarę sensownego - Dependency Inversion los, który nas w tym odcinku interesuje najbardziej. Tak to już jest, że czasami warto na coś spojrzeć z drugiej strony. Wiele technik i praktyk powstało dzięki takiemu założeniu (np. TDD) i podobnie jest z DI. Zejdźmy trochę głębiej w rozważaniach. Wujek wyróżnił 2 rodzaje zależności: run time oraz compile time. Zasada DI dotyczy tej drugiej - zależności czasu kompilacji.

Cash baby, cash...
W językach statycznie typowanych (takich jak Java, C#, C, C++) koszt zależności kodu źródłowego (typu compile time) jest znaczny. Kompilator musi poznać szczegóły modułów, do których się odnosimy za pomocą nazw w kodzie. Często w takim wypadku musi skompilować powtórnie wszystkie moduły zależne. Kiedyś kompilacja systemu mogła trwać nawet godziny. Dzisiaj w zasadzie moglibyśmy stwierdzić, że to nie problem - w końcu kompilatory czy to Javy czy C# są już naprawdę sprawne. Jednak ciągle czas kompilacji dużego systemu może być denerwujący - nawet jeśli trwa tylko pół minuty. Co innego jeśli weźmiemy na stół wdrożenie. Załóżmy, że zmiana w jednej klasie powoduje konieczność przebudowy wielu modułów, wtedy wszystkie musimy zdeployować - chore! Moim zdaniem jednak znacznie gorsze są utrudnienia z samym developowaniem. Załóżmy, że nad systemem pracuje większy zespół podzielony w celu rozwoju różnych komponentów. Jeśli zmiany jednego zespołu powodują konieczność kompilacji innego zespołu to mamy do czynienia z efektem opisywanym krótko - aczkolwiek zacnie - przez Pawła Włodarskiego - syf i zniszczenie.

Odwracamy...
Warto wiedzieć co jest podstawą do idei odwracania zależności. Wujek Bob wskazuje na projektowanie strukturalne (metoda top-down). Sposób zakłada rozpoczęcie dekompozycji problemu od głównej funkcji - main. Następnie projektuje się podprogramy, które mają być wywoływane przez main w celu realizacji pod-zadania. Podobnie każdy podprogram zostaje podzielony na jeszcze mniejsze podprogramy itd, aż zaprojektujemy wszystkie podprogramy konieczne do realizacji celu. Mając taki projekcik możemy zacząć pisać kod (yeah:D). Problem z tym podejściem jest taki, że zależności czasu kompilacji są dokładnie takie same jak czasu wykonania (w trakcie kompilacji wiemy, które kawałki kodu możemy wołać i potrzebujemy znać szczegóły ich implementacji).

Projektowanie strukturalne (top-down)
Wysoko-poziomowe moduły, np modelujące przypadki użycia, zależą od niżej poziomowych - szczegółów. Tego chcemy uniknąć, a z pomocą przychodzi polimorfizm. Weźmy moduł A, który woła metodę m z modułu B. Pierwotnie wygląda to mniej więcej tak:

No dobra, ale gdzie ten polimorfizm? Pomysł polega na wprowadzeniu punktu pośredniego w postaci interfejsu, który zostanie zdefiniowany w module A. Moduł A wiedziałby wtedy tylko o interfejsie i mógłby działać bez wiedzy o module B. Gadanie gadaniem, ale czas na obrazek:


Prosty zabieg, ale otrzymujemy bardzo ważną cechę. Abstrakcje w tym podejściu nie zależą od szczegółów - to szczegóły zależą od abstrakcji. Zależności czasu wykonania (A woła B) są w tym momencie w przeciwnym kierunku niż zależności czasu kompilacji (B zależy od interfejsu z A). I to ostatnie zdanie zawiera magiczne odwrócenie zależności. W drugiej części odcinka wujek Bob opowiedział jeszcze o tym jak budowali framework i jaką w nim rolę miało o DI oraz zaprezentował 2 proste przykłady.

Publika się obudziła - w końcu dostaliśmy jakiegoś koda...



SOLID by example: Flash talk Łukasza Strobina

Po zmęczonym już nieco wujku Bobie przyszedł czas na Łukasza Strobina z Transition Technologies, który zaprezentował zasady SOLID w przykładach z kodem. Dla każdej z zasad Łukasz wskazał kod naruszający jej zasady oraz rozwiązanie. W trakcie nawiązała się fajna dyskusja, padło kilka ciekawych stwierdzeń. Jedno wydaje mi się bardzo celne, że najważniejszy jest zdrowy rozsądek, czyli narzędzie, które pozwala świadomie łamać zasady.

Już za tydzień, 26 czerwca, kolejne spotkanie z Robertem Martinem dzięki firmie Seamless. Na ostatnim przed wakacjami spotkaniu wujek zaprezentuje case study zasad SOLID. Więcej o spotkaniu na meetupie. Zapraszamy, będzie jazdaaa.

PS. Dzięki za Pawłowi Włodarskiemu za zdjęcia.

Wednesday, June 11, 2014

2014-05-06 Pisanie i testowanie programów pod kątem integralności danych

Na ostatnim spotkaniu JUG Łódź Marek Strejczek z firmy Rule Financial wprowadził nas w ważny świat integralności danych. Prostymi przykładami oraz przystępnym wstępem teoretycznym przedstawił co to znaczy integralność danych, kiedy potrzebujemy takiej integralności i jakie są sposoby by ją osiągnąć.

Przypomnieliśmy sobie co znaczy ACID, oraz jak działają transakcje. Marek przedstawił też model BASE, który rozwinąć można do Basic Availability, Soft-state, Eventual consistency. Dowiedzieliśmy się jak do integralności danych podchodzą banki na przykładzie bankomatu a jak podchodzi Amazon na przykładzie kupowania książek.

Na spotkaniu nie obyło się bez działającego przykładu. Marek przedstawił nam prosty system zbudowany w oparciu o kilka interesujących technologii:

  • Active MQ
  • MySQL
  • JBoss
  • JBehave
  • Apache Camel

System składał się z dwóch kolejek, serwisu oraz bazy danych. Serwis miał na celu pobranie danych z kolejki wejściowej, umieszczenie danych w bazie danych a potem wrzucenie odpowiedzi na kolejkę wyjściową.

Za pomocą narzędzia Byteman Marek doprowadził do błędów w działającym systemie przez co została uszkodzona integralność danych w przykładowej bazie. Zaprezentowane zostały specjalne historyjki BDD napisane w JBehave sprawdzające reakcję systemu na wypadek porażki jak i sukcesu.

Na koniec prezentacji rozmawialiśmy o Shared Resource Pattern i jakie problemy rozwiązuje.

Jako, że było to pierwsze spotkanie w miesiącu, rozlosowaliśmy jedną licencję na jeden z produktów JetBrains. Na najbliższym spotkaniu JUG Łódź będziemy mieli okazję posłuchać wujka Boba na temat Dependancy Injection.

Jeżeli jesteście zainteresowani koniecznie zarejestrujcie się na spotkanie na naszym JUG-owym meetupie. Link do meetup-a:

http://www.meetup.com/Java-User-Group-Lodz/events/184627302/

Do zobaczenia na spotkaniu.

Monday, June 2, 2014

2014-05-29 - Vaadin on tour - przystanek Łódź

W czwartek 29.05.2014 mieliśmy zaszczyt gościć Macieja Przepiórę z firmy Vaadin, który nam przybliżył nieco tajniki tego frameworka.

Vaadin - w języku fińskim oznacza samicę łosia (klępa), stąd charakterystyczny znaczek }> mający kojarzyć się z łosiem, będący jednocześnie logiem Vaadina.

Wracając do rzeczywistości, sam Vaadin jest przeznaczony do aplikacji typu Rich Client / Fat Client oraz tak zwanych single page application z wykorzystaniem wzorca projektowego MVP (Model-View-Presenter).
Vaadin sam w sobie nie nadaje się na typową "stronę" html. Vaadin jest frameworkiem do pisania aplikacji internetowych.
Prowadzący podkreślał, że Vaadin ma masę widgetów, kontrolek które wyróżniają go z tłumu (ponad 400) i tylko wyobraźnia programisty co chce osiągnąć przy użyciu kontrolek jest jego ograniczeniem (Sky is the limit....)

Vaadin jest aplikacją podobną w działaniu do GWT, lecz jak przekonywał autor prelekcji nie jest tak do końca.
Otóż w GWT mamy różne części kodu
- serwer - wykonywany na serwerze,
- shared - współdzielony między klientem a serwerem
- client - wykonywany po stronie klienta

    Natomiast Vaadin ma kod serwerowy, którego klient to de facto kod Javy kompilowany do JavaScriptu, a następnie kompresowany i wykonywany przez przeglądarkę.
    Co jest dodatkowym plusem Vaadina kod serwerowy jest napisany w dowolnym języku opartym na JVM (Java,Scala, Groovy). Warte podkreślenia jest to, że całość wykonywanego kodu odbywa się po stronie serwera.

    Bardzo ciekawie wygląda prezentacja i objaśnianie "jak to działa" - po stronie serwera cały nasz kod to są komponenty, natomiast to co prezentowane jest po stronie klienta - to widgety. Gdy zechcemy zrobić jakiś widget niekonwencjonalny, wtedy musimy rozszerzyć klasę Widget z GWT, dość ciekawie Maciek zaprezentował temat działania aplikacji na load balancerach i dużym obciążeniu oraz podał przykładowo ile aktywnych sesji jest w stanie obsłużyć Vaadin bez wyraźnego spowolnienia.

    Podczas prelekcji prowadzący był bombardowany pytaniami z publiczności i wyjaśnianiem "how to", oraz porównań i analogii do GWT.
    Ogólnie poziom merytoryczny prelekcji był bardzo wysoki o czym może świadczyć interakcja na linii publika - prowadzący oraz bardzo duża frekwencja (71 osób - bardzo dziękujemy !!!) a także czas prezentacji (2 godziny !!)
    Chyba najlepsza frekwencja na JUGu!