…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.

Zachęcam Cię do dalszego obserwowania mojego bloga poprzez: polubienie fanpage na Facebooku, subskrypcję kanału RSS, zapisanie się na listę mailingową:



lub śledzenie mnie na Twitterze. Dzięki temu na pewno niczego nie pominiesz.

Chcesz więcej? W takim razie zapraszam Cię do dołączenia do dedykowanej grupy 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.

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ę 3372,83 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ś dorzucić swoją cegiełkę do wspomnianego miliona bez wydawania dodatkowych pieniędzy, to wystarczy, że skorzystasz z któregoś z przewijających się tutaj linków afiliacyjnych. Rzuć także okiem na ciągle uzupełnianą stronę zestawiającą najlepsze kursy programistyczne na portalu Udemy, a poszukując atrakcyjnego konta firmowego, osobistego, oszczędnościowego, czy ciekawej lokaty bankowej, przyjrzyj się odpowiedniemu rankingowi i skorzystaj z wybranej oferty poprzez moją stronę. Dziękuję!

Picture Credits