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

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.

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 🙂

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ą:

Dołączając do newslettera #NoweRozdanie2 otrzymasz dostęp do dodatkowych materiałów:

  • PDF: „Jednoosobowa działalność gospodarcza krok po kroku” (do artykułu)
  • PDF: „FAQ: Jak pracuje się dla Roche/Sii?” (do artykułu)
  • PDF: „Jak zmniejszyć prawdopodobieństwo wystąpienia kontroli i co zrobić kiedy urzędnik zapuka do Twoich drzwi?” (do artykułu)

Powyższe dane są przechowywane w systemie Mailchimp i nie są udostępniane nikomu innemu. Więcej szczegółów znajdziesz na stronie polityki prywatności.

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ć :)

Dołącz do grup na Facebooku

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 (niekoniecznie młodego) programisty.

Wesprzyj mnie

Jeżeli znalezione tutaj treści sprawiły, że masz ochotę wesprzeć moją działalność online, to zobacz na ile różnych sposobów możesz to zrobić. Niezależnie od tego co wybierzesz, będę Ci za to ogromnie wdzięczny.

Postaw mi kawę na buycoffee.to

Na wsparciu możesz także samemu zyskać. Wystarczy, że rzucisz okiem na listę różnych narzędzi, które używam i polecam. Decydując się na skorzystanie z któregokolwiek linku referencyjnego otrzymasz bonus również dla siebie.

Picture Credits