niedziela, 16 grudnia 2012

Trollejdoskop

Lista trolli na które natknąłem się w tym tygodniu w necie + opis skuteczności niektórych antytroli.

Troll - zadajesz złe pytanie


Przykład codzienny :

[użytkownik 1] - "hej, doradźcie którędy najszybciej na morskie oko".
[troll] - " to dziwne, że chcesz jechać nad morskie oko, przecież nad morzem jest cieplej i mają więcej ryb"

[troll - wersja złośliwa] - "to dziwne, że chcesz jechać nad morskie oko, przecież nad morzem jest cieplej i mają więcej ryb. Nie znasz się turystyce i lepiej, żeby ktoś ci zabrał kluczyki od samochodu bo pozabijasz nas wszystkich"

Przykład IT :

[użytkownik 1] - "hej, doradźcie jakąś bibliotekę do XXX".
[troll] - "to dziwne, że chcesz używać podejścia XXX, czy na pewno wiesz co robisz? Ja bym użył YYY"

Opis : bardzo sporadycznie osoba odpowiadająca faktycznie zasugeruje lepsze rozwiązanie ale jednak częściej kieruje się ona niedostatecznymi informacjami. Pytający podaje tylko ograniczony zestaw informacji gdyż potrzebuje jednej małej odpowiedzi na proste pytanie.

Troll - polonista


Przykład codzienny :

[użytkownik 1] - "hej, skończyła mi się wódka i chcę skoczyć do sklepu, doradźcie gdzie jest najkrótsza kolejka.".
[troll] - "Do sklepu się nie skacze a chodzi. Nie wiem czy wiesz ale skakanie to wysoce nieefektywny sposób na dotarcie do sklepu"

[troll - wersja złośliwa] - "Do sklepu się nie skacze a chodzi. Nie wiem czy wiesz ale skakanie to wysoce nieefektywny sposób na dotarcie do sklepu. Ciekawe czy jak odprowadzasz swoje dzieci do szkoły to tez im każesz skakać. takich jak ty powinno się zamknąć!"

Przykład IT :

[użytkownik 1] - "my używamy metodologii XXX".
[troll] - "kolego, metodologia to nauka o metodach. Jeśli tego nie wiesz to chyba najlepiej świadczy o tym jakim 'specem' od XXX jesteś"

Opis : Wszelkie skróty myślowe, uproszczenia czy przejęzyczenia stanowią doskonały element zaczepny dla trolla.

Troll - twoje argumenty wymyślili debile


Przykład codzienny :

[użytkownik 1] - "siema, gdzie najlepiej w samochodzie naprawić XXX?".
[użytkownik 2] - "siema, w 'Mechaniku Niedzielnym' podawali, że najlepiej udać się tu i tu ".
[troll] - "Czytaj dalej tych idiotów każą ci rozebrać samochód. XXX nie może być dobre, nie próbowałem ale to napisali idioci to musi być debilne"

[troll - wersja złośliwa] - "Czytaj dalej tych idiotów każą ci rozebrać samochód. XXX nie może być dobre, nie próbowałem ale to napisali idioci to musi być debilne. Pewnie jesteś tak samo 'inteligentny' jak oni - swój ciągnie do swojego"

Przykład IT :

[użytkownik 1] - "w artykule YZ wyczytałem, że poleca on XXX - sprawdzał to ktoś".
[troll] - "YZ podobnie jak debile z jego otoczenia wypisuję tylko takie głupoty"

Opis : Tutaj troll samo tworzy punkt zaczepny. Standardowa technika - nie mam argumentów ale wiem ,że jesteś głupi. Jeśli tylko da się trzeba zignorować

Troll nuklearny


autentyk!
[użytkownik 2] - "Czasy są trudne, musimy zapomnieć o tym co dzieliło nasze zespoły i postarać się udowodnić, że możemy pracować razem dla lepszych wynikół"
[troll] - "Nie zgadzam się,że to dobre podejście - weźmy na przykład Taki Oświęcim..."

Opis : Użytkownik ma setne sekundy aby użyć neutralizatora trollollolo zanim eksplozja nuklearna dokona definitywnej anihilacji tematu


Antytrole

  • Ignorowanie - możliwe tylko wtedy gdy natura trolla jest dobrze znana na forum i żaden inny użytkownik nie da się sprowokować. Trudne do wykonania gdy troll próbuje ośmieszyć użytkownika technikami z pola erystyki.
  • Apel o nietrolowanie - dodatkowe dokarmienie i doładowanie trolla
  • Trolem w trolla - bardzo niebezpieczne - ryzyko szybkiej eskalacji trolozbrojeń
  • Wujek cięta riposta - jeśli uda się headshot troll może zostać zneutralizowany.
  • Merytoryczne strollowanie trolla - próba przywrócenia głównej wagi wątkowi merytorycznemu - technika w trakcie badań.

niedziela, 9 grudnia 2012

Primitive obsession - czyli skąd biorą się klasy Utils

To jest tak pewne jak to, że po dniu nadchodzi noc a po pijackiej nocy nadchodzi kac - prędzej czy później w większości projektów pojawiają się klasy o znajomo brzmiącej nazwie cosTamUtils. Na osobny artykuł zasługuje wytłumaczenie dlaczego klasy "Utils" psują model obiektowy i dlaczego jest to bardzo niedobry i bardzo bardzo zły antywzorzec.

Jeśli ktoś chce zbadać ten temat to niech się zastanowi lub poszuka na necie informacji o tym czy lepiej stworzyć klasę Money czy też MoneyUtils ( ewentualnie kliknie tutaj : Utils antipattern )

Dla tych którzy wierzą, ze trzeba się pozbyć utilsowego brzemiona (tak to się chyba odmienia) poniższy tekst.

Geneza

Zaczyna się niewinnie od klasy :

 
class User{
   private String phoneNumber;
}

Mija tydzień, ceny paliwa idą w górę a w międzyczasie pojawia się nowe wymaganie aby określić numer kierunkowy.

 
class User{
   private String phoneNumber;

   public Object doSomething(){
       ...
       String directional=resolveDirectional();
       ...
   }

   private String resolveDirectional(){
          doSomethingWith(phoneNumber)
   }
}

Mija kilka miesięcy nadchodzi wiosna, w drogach zaczynają pojawiać się dziury a tymczasem w naszej aplikacji pojawia się pojęcie Biura.

 
class Office{
   private String phoneNumber;

   public Object doSomething(){
       ...
       String directional=resolveDirectional();
       ...
   }

   private String resolveDirectional(){
          doSomethingWith(phoneNumber)
   }
}

I w tym momencie doświadczony programista wzdryga się od obrzydzenia - nastąpiło powtórzenie w kodzie! Trzeba by to gdzieś wynieść ale gdzie? Ani to nie pasuje dla klasy User ani do klasy Office. To może by to gdzieś zawiesić w przestrzeni aby każdy mógł sobie korzystać - taka samotna procedurka pośród obiektów.

[IRONIA]

Niestety okazuje się, że twórcy Javy byli debilami i wymyślili sobie, że każdy koncept musi być wyrażony za pomocą jakiejś klasy. Na całe szczęście jest to słówko static...

[/IRONIA]

Chwytamy się brzytwy i głośne fanfary obwieszczają narodziny klasy PhoneUtils :

 
class abstract PhoneUtils{
   public static String resolveDirectional(phoneNumber){
          doSomethingWith(phoneNumber)
   }
}

Rozwiązanie

Jeden Kod jest wart więcej niz 1000 słów...

 
class User{
   private PhoneNumber phoneNumber;

   public Object doSomething(){
       ...
       DirectionalNumber directionalToUsersPlace=phoneNumber.directional()
       ...
   }
}

W zależności od problemu Można nawet pójść dalej i stworzyć lepszą enkapsulację:

 
class User{
   private PhoneNumber phoneNumber;

   public Object doSomething(){
       ...
       City cityToContact=phoneNumber.toCity()
       ...
   }
}

Obsesja zajętości pamięci

Wczoraj na coderetreat miało miejsce ciekawe zachowanie. Pomimo, że cel ćwiczenia był jasno sprecyzowany (chyba - mam nadzieję, że te wszystkie tłumaczenia i metafory coś dały :) ) - "uczymy się pisać doskonały kod" to jednak kilka grup jasno uzasadniło swój projekt słowami - "to zajmie mniej pamięci". Jeszcze raz głośno i wyraźnie :) Do momentu kiedy ograniczenia sprzętowe staną się problemem - nie są one problemem (i nie, nie będzie ku*wa wtedy za późno aby się o to martwić)

Dodatkowe materiały

niedziela, 2 grudnia 2012

Antywzorzec Obiektowy Manager-Helper

Przy okazji przygotowań do Coderetreat mam po raz chyba już siódmy w życiu to uczucie kiedy wydaje mi się, że w końcu zrozumiałem o co chodzi w programowaniu obiektowym. A jak to ktoś tam mawiał, jeśli coś rozumiesz to powinieneś być w stanie wytłumaczyć to małemu dziecku. No To spróbujmy.

(anty)Wzorzec Manager-Helper

Nie chce mi się znowu wrzucać co, kto, gdzie i kiedy dlatego napiszę jedynie, że kiedyś miałem okazję pracować w projekcie sprowadzającym programowanie obiektowe do następujących kroków :

  1. Stworz klasę CostamManager
  2. Gdy klasa CostamManager zacznie oscylować wokół 8 tys linii zacznij przenosić część kodu do klasy CostamHelper
  3. A jeśli jesteś naprawdę bystry to dodaj jeszcze CostamControler - wiesz, żeby było tak bardziej obiektowo.

Dlaczego wzorzec Manager-Helper to zły pomysł?

Wyjaśnienie dla dzieci

Wyjaśnimy to używając wiernej kopii Feliksa co to wszyscy pisali na fejsie, że wylądował.
Jeśli tak zdekomponujemy Feliksa to możemy mu wymienić niezależnie rączki na bardziej rakietowe, i nóżki na bardziej rakietowe i może główkę na bardziej rakietową.
Tutaj drogie dzieci nie jest tak łatwo wymienić główkę bo będziemy musieli wymienić też i jedną rączkę ( a może nie chcemy!) i kawałek drugiej. I jak teraz Feliks będzie miał część rączki rakietowej a część nierakietowej to się nam posypie. Oj trzeba zmienić wszystko :(
Tak też nie jest dobrze.
I Kontroler tak naprawdę niewiele tu zmienia

Nie dla dzieci

NA koniec polecam jedną z lepszych książek o Obiektówce jakie czytałem : Object thinking