poniedziałek, grudnia 13

Clean Code

Witam,

dziś chciałem napisać kilka słów o książce Clean Code - Robert C. Martin. Nie będę się rozpisywał o książce, należy ją po prostu przeczytać.

Książkę podzielił bym z ważywszy na doświadczenie czytelnika w programowaniu. Osoby które to programują poniżej 1,5 roku lub bawią się tylko w programowaniem, niech potraktują książkę jako pozycje obowiązkową. Osoby programujące zawodowo mogły się spotkać z większością zagadnień w pracy codziennej.

Może nieskromnie, ale pozwolę sobie zaliczyć się do 2 grupy i większość zagadnień była mi znana ale czytanie książki to tylko przyjemność i bardzo fajnie było sobie odświeżyć informacje, poznawać nowe elementy pożądanego programowania i uporządkować zamglone elementy wiedzy.

Niektóre problemy dokuczają tylko pracującym w dużych projektach(30 > osób), dlatego też niektóre elementy przez osoby nie pracujące w takich projektach mogą zostać niedocenione.

sobota, sierpnia 28

Chain of Responsibility


Purpose:

Gdy potrzebujemy by request mógł być obsłużony przez kilku odbiorców(handler). Odbiorcy są połączeniu ze sobą i przekazują wzajemnie między sobą wynik obsłużenia.


Use:

  • wiele obiektów może obsłużyć żądanie, nie jest zdeterminowane jaki obiekt będzie wstanie obsłużyć żądanie,
  • kilka obiektów może obsłużyć żądanie, obiekty obsługujące są determinowane w czasie wykonania (runtime),
  • jest do przyjęcia to, że żądanie nie zostanie obsłużone przez żaden obiekt.


Not Use:

  • każde żądanie obsługiwane jest tylko przez jedne obiekt,
  • gdy klient wie jaki serwis obsługuje jakie żądanie.


Example

Wzorzec ten realizowany jest przez obsługę wyjątków w niektórych językach. Gdy pojawia się wyjątek w metodzie, najpierw sprawdzane jest czy dana metoda posiada mechanizm obsługi, jeżeli dana metoda nie posiada mechanizmu obsługi wyjątek przekazywany jest do kolejnej metody na stosie. Przekazywanie kontynuowane jest do momentu napotkania metody potrafiącej obsłużyć wyjątek lub do skończenia się wywołań na stosie.


Resource:

wtorek, sierpnia 24

Gang of Four

Witam,
po pracowitym okresie nauki do SCJP i zdaniu egzaminu,

postanowiłem zrealizować mój stary pomysł szybkiego re-view wszystkich 23 wzorców przedstawionych przez Gang of Four, a po raz pierwszy zaprezentowanych w książce Design Patterns: Elements of Reusable Object-Oriented Software. Każdy wzorzec zostanie wyposażony w diagram, opis, przykład użycia oraz namiar na inne źródła z informacjami.


Creational Patterns, używane do tworzenia instancji w taki sposób by w jak największym stopniu ukryć logikę i skomplikowanie procesu tworzenia.

  • Abstract Factory - pozwala na zgrupowanie fabryk działających w tej samej domenie,
  • Builder - oddziela budowanie obiektu od prezentacji, ma za zadanie ukryć skomplikowany proces budowania,
  • Factory Method - budowanie złożonego obiektu bez dokładnego wyspecyfikowania drzewa zwróconych obiektów,
  • Prototype - tworzenie nowej instancji klasy na podstawie już istniejącej instancji,
  • Singleton - ma za zadanie zbudowanie tylko jednej instancji klasy. Niektóre źródła podają ten wzorzec jako 'antywzorzec'.


Structural Patterns, skupione są na klasach i dużych strukturach obiektów. Poprzez wykorzystanie dziedziczenia i kompozycji pozwalają na utworzenie nowych funkcjonalności na podstawie już istniejących.

  • Adapter - pozwalana na współpracę klas z niekompatybilnymi interfejsami,
  • Bridge - bardzo mocne oddzielenie(low coupling) formy abstrakcyjnej klasy od implementacji, co pozwala je traktować niezależnie,
  • Composite - zebranie kilku obiektów w jeden, pozwala to na manipulowanie obiektami jak by były jednym obiektem,
  • Decorator - dynamicznie dodaje/nadpisuje zachowanie metod w obiektach,
  • Facade - udostępnia uproszczoną formę dużej ilości złożonego kodu,
  • Flyweight - zmniejsza koszt tworzenia i manipulowania dużą liczbą podobnych obiektów,
  • Proxy - zastępnik dla innego obiektu, ma za zadanie kontrolować dostęp, zredukować koszt użycia.


Behavioral Patterns, mają za zadanie uprościć komunikację, dzielenie się obowiązkami pomiędzy obiektami.

  • Chain of Responsibility - deleguje polecenia do łańcucha przetwarzania,
  • Command - tworzy obiekt enkapsulujący działanie i parametry,
  • Interpreter - interpretuje nasz wewnętrzny język (nasz mały DSL),
  • Iterator - sekwencyjny dostęp do obiektów bez zdradzania wewnętrznej implementacji,
  • Mediator - pozwala na luźne powiązanie klas, gdzie tylko mediator posiada informację o budowie obiektów. Klasy wzajemnie nie posiadają informacji o swoich metodach,
  • Memento - umożliwia zawsze przywrócenie obiektu do stanu z przed zmiany, operacja(undo),
  • Observer - wzorzec publish/subscribe pozwala dużej liczbie obserwatorów(observers) zobaczyć zdarzenia,
  • State - pozwala na zmianę zachowania obiektu, gdy jego stan ulegnie zmianie,
  • Strategy - pozwala na wybieranie algorytmu ze zbioru podczas runtime'u,
  • Template Method - definiuje szkielet algorytmu jako klasę abstrakcyjną, konkretne implementacje precyzują poszczególne zachowania,
  • Visitor - wydzielenie algorytmu ze struktury na której pracuje.


Polecam też kilka anglojęzycznych katalogów wzorców:

sobota, sierpnia 14

google.com vs Oracle(fake Sun)

Witam,
pewnie większość z was już się dowiedziała, że Oracle zasępił się na Google. Pierwsze zdanie wyraża moje sympatie, ale nie o tym chce pisać.

Przeczytanie kliku postów pozwoliło mi stwierdzić, że nie chodzi tu o łamanie patentów, ale o pieniądze. W sieci pojawiała się informacja, że Android zanotował ogromny wzrost popularności. Panowie z Oracle zorientowali się, że można spory kawałek tortu dla siebie zagarnąć.

Podobna historia pojawiała się już wcześniej Sun vs Microsoft, wtedy Java nie posiadała jeszcze tak ugruntowanej pozycji i Microsoft porzucił Jave. Działanie Sun'a pozwoliło na pojawienie się na C# i .NET - pomijając fakt, że pochodzą z Microsoft - znakomite rozwiązanie, nie można mu nic złego zarzucić.

Podejrzewam, że dziś będzie inaczej. Google postara się osiągnąć jakieś ogólne porozumienie, które pozwoli Oracle dostawać ich kawałek Android'owego tortu, a nie narazi google na straty i upokorzenie. Jeżeli porozumienie by nie zostało osiągnięte to rychło zobaczymy nowe googlowe rozwiązania. Może zostanie bardziej rozbudowany google GO lub też uśmiechną się do c++, pythona.

W chwili obecnej chyba google nie porzuci 25% rynku programistycznego i pewnie podpisze porozumienie z Oracle.

Oracle zaczyna się bawić w trola patentowego, tak dużej i porządnej firmie to nie przystoi.

Jeżeli ktoś jest zainteresowany aspektami technicznymi pozwu polecam en.swpat.org/wiki/Oracle_v._Google_%282010,_USA%29.

niedziela, czerwca 27

javazone 2010 i wuwuzela

Witam,

pewnie się zastanawiacie co ma wspólnego javazone2010 i wuwuzela, no nic, poza tym, że informacja o obu pojawi się w jednym poście.

Kapituła JavaZone 2010 postanowiła w oryginalny sposób zareklamować swoją konferencję i wyprodukowała trailer http://jz10.java.no/java-4-ever-trailer.html, nie wiem czy ktoś wybiera się na JavaZone2010, ale trailer każdy musi zobaczyć.

Czas na kilak słów o "Wuwuzeli", słowo to w języku zulu oznacza "robić hałas". Ale mundialu w RPA hałas nabrał nowego znaczenia i nazywamy go "koncertem wuwuzeli" :P. Teraz można dzięki naszemu wielkiemu wujkowi google, który to stał się ostatnio właścicielem youtube posłuchać tego koncertu.

Podczas oglądania trailera, na dolnym pasku kliknijcie piłkę, właśnie włączony "koncert wuwuzeli" zostanie zakłócony przez trailera, ale trzeba się poświecić by wysłuchać wuwuzeli;p.


Pozdrawiam,
Arkadiusz Borek

środa, maja 19

Kreatywność użytkownika ??, nie istnieje / a może jest za duża

Witam;

Ostatnim czasem zakrzątam sobie głowę SCJP, Grails i CleanCode, ale dzisiaj postanowiłem przerwać moje działania i napisać małego posta.

Czy można tak zbudować ekran by nie można było wpisać niepoprawnych informacji?. Nie, na tym mógł bym zakończyć posta, ale ….

Programiści starają się zbudować ekran, a na nim tak doskonałe walidatory by nie pozwalały na wprowadzenie błędnych danych, ale ….(to już 2 ale)

Niech nasza formatka posiada dwa pola: 'imię', 'nazwisko'.

1. Nasze pola są mandatory.
Po pewnym czasie zobaczymy na bazie pola wypełnione 'spacją'. Użytkownik był sprytny, że wprowadzał spacje, nasz błąd. Naprawa banalna, dodajemy trim() wołamy isEmpty() i mamy walidatora poprawionego.

2. Nasze pola są mandatory, odporne na psute stringi.
Aż tu pewnego dnia zobaczymy na bazie pola 'imię' = '????', 'nazwisko' = ????. Naprawimy to poprzez sprytnego regexp'a. Teraz nasze pole powinno się zaczynać od literki, następnie może zawierać tylko takie znaki jakie my zdefiniowaliśmy. Success.

3. Nasze pola są mandatory, odporne na puste stringi, można wpisać tylko to, co chcemy. Jednym słowem nie do złamania.
Pewnego dnia przychodzi zgłoszenie od klienta, raport użytkowników nie zawiera poprawnych danych. Oczywiście nasze pola są mega bezpieczne i jak może raport źle działać przecież sam go pisałem:P, więc do zgłoszenie zabieramy się z dużą rezerwą i niedowierzaniem. Testowa generacja raportu pozwala stwierdzić, że pojawił się string 'Brak danych'. Konsternacja. Sam pisałem raport wiem, że wstawiałem żadnych domyślnych wartości, więc co pozostaje, przepytanie kolegów czy nie wprowadzali jakiejś nowej modyfikacji. Nikt się nie przyznaje. Szukamy dalej, aż tu nagle naszym oczom ukazuje się user'a który to 'imię' = 'Brak', nazwisko = 'Danych'.
A teraz jak poprawić walidację.


A w międzyczasie nasz kreatywny user świętuje zwycięstwo.



Z inwencją twórczą user'ów się nie wygramy. Mam, nadzieję, że użytkownicy naszych systemów są na tyle inteligentni i wiedzą, że wpisanie 'Brak Danych' == null.


to tak z życia programisty ;p


Pozdrawiam,
Arkadiusz Borek

wtorek, maja 4

The Differences Between Good Designers and Great Designers

Witam;

Zajęty pracą, oraz sprawami dnia codziennego nie mam czasu na nic twórczego(poza pracą ;p), ale dzisiaj w południe było mi dane przeczytać bardzo dobry wpis na stronie www.drawar.com. Wpis był interpretacją prezentacji 9 skills that separate good designers zrobioną przez Cameron Moll.

Prezentacja nie miała za wiele wspólnego z java, ale bez większych problemów można ją przenieść na nasze podwórko.

Pozdrawiam,
Arkadiusz Borek

ps. Ze strony prezentacje pobierzcie ją w wersji pdf, mnie design tej prezentacji bardzo zaciekawił.

niedziela, kwietnia 18

Spoon

Witam;

By pewne rzeczy jakie przychodzi nam robić w każdym naszym projekcie stały się przyjemne pojawiała się nowa biblioteka opj4, o samej bibliotece było już wspominane na polskich portalach, uczynił to np. Sławek Sobódtka na swoim blogu. Wspominam o niej ponieważ pojawił się op4j 1.0 RELEASE. Biblioteka rozwiązuje podstawowe problemy w bardzo prosty i przystępny sposób, dlatego też nie inaczej jest napisana do niej dokumentacja, powstaje ona formie bloga.

Życzę wszystkim miłej zabawy.

ps. Przy pierwszym zetknięciu naprawdę zadziwia podejście autorów do problemu.

wtorek, lutego 16

Jak nas widzą, tak nas...

witam;

znalazłem obrazek poniższy pod adresem: http://konieczny.be/geekfun/jezyki_programowania.jpg.

Oto jpeg:



... czy mógł by być on bardziej obrazowy;

sobota, lutego 6

niedziela, stycznia 31

'Śmierć' przeglądarek

Google właśnie ogłosiło politykę wparcia przeglądarek dla swoich produktów.

Od dnia 1 marca google będzie wspierać tylko przeglądarki w wersjach:

  • Microsoft Internet Explorer 7.0+,
  • Mozilla Firefox 3.0+,
  • Google Chrome 4.0+,
  • Safari 3.0+.


Informacja nie była by ważna gdyby nie pozycja googla na rynku. Google wyznacza trendy dlatego też za nim pójdą inne firmy i już niedługo na starszych przeglądarkach nie będzie można korzystać z takich technologi jak:


ps. Jestem pewien, że nie wymieniłem wszystkich technologii jakie mogą przestać działać, jeżeli jakaś nowa technologia Czytelniku przychodzi Ci na myśl, proszę umieść to w komentarzu.

poniedziałek, stycznia 25

KISS

Inżynierowie są perfekcjonistami. Interesują nas zawsze szczegóły rozwiązania, oraz schludność. Opracowując rozwiązanie musimy być pewni, że coś działa tak jak powinno. Często bywa tak, że posiadamy gotowe rozwiązanie, ale cały czas mamy niedosyt. Przecież każde rozwiązanie może być jeszcze szybsze, ładniejsze, wydajniejsze.

Posiadamy duża wiedzę która to umożliwi zoptymalizowanie naszego rozwiązania. Znamy np. wzorce programistyczne i umiemy je zaimplementować, przerabiamy nasza działając funkcjonalność zgodnie z wzorcem, przecież kiedyś może zostać rozszerzona, a nas wzorzec tak upraszcza proces rozszerzenia. Ale czy tak powinno być ??

Oprogramowanie jakie tworzymy ma spełniać wymagania klienta, jak często zdarza się nam zaimplementować jakieś wymaganie, ale przy okazji robimy pewne 'zbędę' rzeczy by nasze rozwiązanie było ładniejsze. Rozwiązywanie problemów prowadzi do poświęcenia 60% czasu implementacji wymagania biznesowego, a 40% zostaje zużytych zastosowania nowego wzorca, technologi.

Z pomocą przychodzi nam zasada KISS z wiki możemy się dowiedzieć, że:
KISS(ang. Keep It Simple, Stupid, czyli nie komplikuj, głupku) jest często wspominana przy dyskusji architektury lub szczegółów budowy projektów. Jej istotą jest dążenie do utrzymania eleganckiej i przejrzystej struktury, bez dodawania niepotrzebnych elementów. Doczekała się polskiego odpowiednika: BUZI (Bez Udziwnień Zapisu, Idioto), atrakcyjnego przez to, że nie tylko oddaje sens akronimu, ale i sam kojarzy się z angielskim pierwowzorem.

Spotyka się inne rozwinięcia KISS:
"Keep it Simple and Stupid" (to ma być proste i głupie),
"Keep It Small and Simple" (to ma być małe i proste),
"Keep It Short and Simple" (to ma być krótkie i proste),
"Keep It Sophisticatedly Simple" (upraszczaj, ale nie posuwaj się do prostactwa).


Chciałbym by zasada ta w oryginale prześwietlała nam zawsze, jak że to ułatwi późniejsze otrzymanie kodu.



ps. Albert Einstein miał swoją wersję zasady KISS: "Wszystko powinno być tak proste, jak to tylko możliwe, ale nie prostsze."
— (1879-1955)

niedziela, stycznia 17

http://update.mousefeed.com

Witam;

Ostatnim czasem oglądałem filmy z ostatnich cooluarów i usłyszałem o plugin'ie mousefeed. Autorzy na początku strony piszą: "The goal of the MouseFeed plugin is to make Eclipse users faster. This approach is complementary to the efforts targeting higher-level productivity". Wolnym tłumaczeniu oznacz to coś takiego: "Głównym celem MouseFeed jest to by uczynić użytkowników szybszych. Ma to pomóc w osiągnięciu większej produktywności".

Co tak naprawdę robi MouseFeed?, Jest to malutki plugin który pokazuje skrót klawiszowy, gdy wykonujemy jakąś czynność.

Plugin mi się przydał, od razu nie mienia przyzwyczajenia używania ikon, ale przez nienachalne pokazywanie skrótu klawiszowego, pozwala w łatwy sposób nauczyć się go. Oczywistym jest to, że plugin nie poprawia wydajność programisty, nie ważne jak bardzo by nam to wmawiali jego twórcy, pozwala jedynie nauczyć się robić pewne rzeczy w Eclipse szybciej.

Jeżeli chodzi o wydajność, to każdy z nas wie, że wydajność.equals(szybkośćPisaniaKodu) nigdy nie będzie prawdą, chyba, że naszym zajęciem jest przepisywania dokumentów lub coś podobnego.