…przynajmniej nie wszędzie.

Teoria

Dawno, dawno temu, kiedy „na poważnie” wchodziłem w świat programowania (czyli napisałem coś więcej niż proste „Hello World” 😉 ), ze wszystkich stron docierały do mnie dobre rady:

Twórz interfejsy i klasy je implementujące. Dzięki temu będziesz mógł na przykład tworzyć odrębne implementacje na potrzeby testów albo być może przyjdzie kiedyś ktoś chcący napisać własną implementację Twojego interfejsu w jakimś zacnym celu. Kontener wstrzykiwania zależności pomoże Ci to wszystko skleić i będzie cacy.

Przez długi czas grzecznie się słuchałem. Bardzo długi czas. Zbyt długi. Dziś mówię…

G***o prawda!

Nie neguję całej idei, bo w ogólności jest słuszna. Niestety wiele osób zapomina o tym, że liczy się kontekst. Zawsze.

Praktyka

Teoria teorią, ale przyjrzyjmy się jak to wygląda w praktyce.

Aplikacje webowe

Jako programista aplikacji webowych mający za sobą kilkanaście mniejszych lub większych projektów mogę powiedzieć, że 99% napisanych/widzianych przeze mnie interfejsów w tego typu aplikacjach miała jedną, jedyną, jedniutką, jedniunią implementację. Finalnie w każdym przypadku mieliśmy interfejs FuckingAwesomeService i jego implementację FuckingAwesomeServiceImpl (albo DefaultFuckingAwesomeService). W efekcie powstawała podwojona liczba typów, gdy tak naprawdę nie miało to żadnego praktycznego zastosowania.

Aplikacja webowa jest „produktem końcowym” – nikt nie użyje jej jako biblioteki, żeby skorzystać z jej funkcjonalności i wprowadzić ich własną implementację. Pisząc testy, w zależności od sytuacji albo mockowaliśmy obiekty, albo używaliśmy produkcyjnej implementacji. Nie pamiętam sytuacji, w której specjalnie dla testów napisaliśmy odrębną implementację jakiegoś interfejsu.

Krótko mówiąc, trzymanie się konwencji interfejs -> implementacja w aplikacjach webowych ma sens tylko w specyficznych przypadkach.

Biblioteki

Inaczej jest we wspomnianych bibliotekach. Jeżeli tworzysz coś, co nie jest „produktem końcowym”, ale „klockiem” do wykorzystania, to trzymanie się interfejsów jest jak najbardziej wskazane. Nie trzeba długo szukać przykładu. Wystarczy zajrzeć do pakietu java.util z JDK. Znajduje się tam choćby interfejs Collection, który w samym JDK posiada kilkadziesiąt implementacji. Dzięki trzymaniu się interfejsu, JDK daje nam możliwość wprowadzenia własnej implementacji jeżeli w „gotowcach” nie znajdziemy dla siebie niczego odpowiedniego. To jest wzorcowy przykład wykorzystania interfejsów. Polecam 🙂

Cykl artykułów "Vademecum Juniora"

Ten wpis jest częścią cyklu, w ramach którego opisuję moje doświadczenia i spostrzeżenia na temat programistycznego rzemiosła. Cykl jest dedykowany osobom rozpoczynającym swoją przygodę z zawodowym programowaniem lub planują taki krok w przyszłości.

Artykuły składające się na Vademecum Juniora zawierają różne porady, wskazówki i przykłady z pracy jako programista. Nie są one ani uporządkowane chronologicznie, ani mocno ze sobą powiązane. Możesz je więc czytać niezależnie od siebie i w dowolnej kolejności. Polecam jednak zapoznać się z treścią wszystkich wpisów, gdyż wierzę, że z każdego możesz dowiedzieć się czegoś wartościowego.

Dosyć!

Nadal pracuję głównie nad aplikacjami webowymi, ale od około dwóch lat nie stosuje(my) już konwencji interfejs -> implementacja. „Nie stosujemy” jest może trochę nieprecyzyjne. Stosujemy, ale tylko w momencie, kiedy faktycznie ma to sens, czyli na przykład wtedy, kiedy pojawia się realna potrzeba wprowadzenia drugiej implementacji. Nie programujemy „na zapas”.

I powiem Ci, że… bardzo mi z tym dobrze 🙂 Kodu jest mniej, nikt nie umarł i w ogóle tak jakoś lżej na duchu 😉

Wniosek jest jeden – nie wszystko jest „prawdą objawioną” i nie wszystko aplikuje się do wszystkiego. Kontekst zawsze miał, ma i będzie miał znaczenie. To właśnie dlatego najczęstszą odpowiedzią doświadczonego programisty jest: „To zależy” 😉 Pamiętaj o tym.

A Ty co myślisz o wpakowywaniu wszędzie interfejsów? Praktykujesz? Czy używasz tylko tam gdzie jest to faktycznie wykorzystywane? Podziel się swoją opinią w komentarzu. Chętnie ją poznam.

Bądź na bieżąco!

Podobają Ci się treści publikowane na moim blogu? Nie chcesz niczego pominąć? Zachęcam Cię do subskrybowania kanału RSS, polubienia fanpage na Facebooku, zapisania się na listę mailingową (spokojnie, nie rozsyłam spamu):



lub śledzenia mnie na Twitterze. Generalnie polecam wykonanie wszystkich tych czynności, bo często zdarza się tak, że daną treść wrzucam tylko w jedno miejsce. Zawsze możesz zrobić to na próbę, a jeśli Ci się nie spodoba – zrezygnować :)

Chcesz więcej? W takim razie zapraszam Cię do dołączenia do powiązanych grup na Facebooku, gdzie znajdziesz dodatkowe informacje na poruszane tutaj tematy, możesz podzielić się własnymi doświadczeniami i przemyśleniami, a przede wszystkim poznasz ludzi interesujących się tą samą tematyką co Ty.

W grupie Programista Na Swoim znajdziesz wiele doświadczonych osób chętnych do porozmawiania na tematy krążące wokół samozatrudnienia i prowadzenia programistycznej działalności gospodarczej. Vademecum Juniora przeznaczone jest zaś do wymiany wiedzy i doświadczeń na temat życia, kariery i problemów (nie koniecznie młodego) programisty.

1 000 000 zł

Milion złotych. Tak, milion złotych. Milion złotych to cel, który sobie postawiłem jakiś czas temu. Chcę zarobić milion złotych na tym blogu. Do tej pory zebrało się 6259,56 zł, więc jak widzisz jeszcze trochę brakuje. Jeszcze nie wiem do końca jak, ale to zrobię. Na pewno nigdy nie będę pobierał żadnych opłat za dostęp do treści, bo tymi chcę się po prostu dzielić.

Wysoko ponad ten milion stawiam na szerzenie wiedzy i dotarcie do jak największej liczby osób. I tu mam prośbę do Ciebie: jeśli uważasz, ten artykuł za wartościowy, to udostępnij go proszę swoim znajomym. Przy lewej lub dolnej (na małych wyświetlaczach) krawędzi ekranu znajdziesz przyciski, które Ci to ułatwią. Jeżeli ich nie widzisz, to najprawdopodobniej zostały zablokowane przez Twój program do blokowania reklam. Niezależnie od tego, czy prześlesz ten wpis dalej, czy nie, to ja i tak dziękuję Ci serdecznie za doczytanie do tego miejsca! Do przeczytania niebawem.

PS. Jeśli mój blog przypadł Ci do gustu tak bardzo, że chciał(a)byś mi się w jakiś sposób odwdzięczyć, to mam dla Ciebie kilka ciekawych propozycji, z których możesz skorzystać. Szczególnie gorąco zachęcam do wsparcia poprzez serwis Patronite, ale jeżeli zdecydujesz się na którąkolwiek z wymienionych opcji, to serdecznie Ci za to DZIĘKUJĘ!

Picture Credits