Wednesday, January 14, 2009

Polimorfizm vs. Polimorfizm (a.k.a. Strategy pattern)

Z cyklu "Bad practices"

Dzis zaskoczyl mnie nasz architekt ale niestety niezbyt pozytywnie. Jako ze facet ma jakies doswiadczenia zyciowe, wydawaloby sie ze sporo juz kodu w swoim zywocie widzial, a moze nawet napisal, nalezal mu sie do tej pory szacunek. Niestety, jak to juz w zyciu jest na szacunek ciezko jest zapracowac, za to stracic go mozna w jednej chwili... co tez kolega Berndt uczynil :-)

Grzebiac w kodzie naszego "wspanialego" systemu znalazlem gdzies taka metode:


public Something getSomethingNice(Something smth) throws Exception {
return smth;
}

prawda ze podejrzanie wyglada? hehe..

Przejrzalem historie zmian i okazalo sie ze metoda getSomething byla kiedys abstrakcyjna a klasa w ktorej obecnie sie znajduje byla kiedys interfejsem.
Jednym slowem niezle sie w systemie pozmienialo przez ostatnich pare lat. Najgorsze jednak bylo to ze ten bzdurny kawalek kodu przeszedl przez code review. Zadalem wiec architektowi pytanie. WHY???

Odpowiedz byla mniej wiecej taka:
Architekt: "Ahh!.. no bo to jest przeciez Strategy Pattern i tak juz musi zostac. Patrz, to sa np. klasy ktore dziedzicza od tej... bo w tej klasie ta metoda nie ma sensu wiec defaultowo zwraca to co przyjela."
Ja: "Ale.. ale... dlaczego ta klasa nie jest juz abstrakcyjna.. A po jakiego wala jest tam ten 'throws Exception'? Czy ktos kontroluje to co sie z kodem dzieje czy nie?"
Architekt: "Niech tak zostanie. Tak sie robi."

To ma byc Polimorfizm? No niby tak sie wlasnie ta cala konstrukcja zachowuje. Nie! Jak dla mnie to chuj nie polimorfizm! Liczy sie jeszce jakosc! - pomyslalem po czym polozylem glowe na klawiaturze, zamkalem oczy myslac o kawalku z "Code Complete" Steve'a McConnell'a o tym jak to zona gotowala kotleta wedle przepisu tesciowej. Nikt nie zastanowil sie nad tym dlaczgo w przepisie stalo "Posolic, popieprzyc i obciac dwa konce steku" (czyli standartowe "Bo tak sie robi"). Okazalo sie ze matka tesciowej lekko przycinala stek bo jej patelnia byla za mala :-) Tak wiec wydaje mi sie ze czasem wypada podrazyc temat troche glebiej by odkryc niepotrzebne bzdury, pozadnie przebudowac subsystem i ulatwic ludziom prace.

Shit, z takim architektem daleko nie zajdziemy.