W telegraficznym skrócie wzorzec projektowy facade / fasada, to prosty interfejs dla złożonego zestawu akcji, klas, interfejsów i/lub podsystemów.
Wytłumaczę Ci to na prostym przykładzie, który mam nadzieję że zapamiętasz i będziesz kojarzyć z fasadą. 🙂 Jesteś szefem dużej firmy i chcesz się połączyć z project managerem działu programistów produktu xyz. Aby porozmawiać z tą osobą, dzwonisz do swojej sekretarki i prosisz aby połączyła Ciebie z project managerem. W tym momencie osoba która łączy Ciebie z project managerem, jest fasadą pomiędzy tobą a osobą z która chcesz się skontaktować.
Jak zaimplementować facade w kodzie
Jak widzisz w przedstawionym przykładzie jest to bardzo proste. Metoda handle (CreatePostFacade) poza samym zapisaniem postu, ma za zadanie pobrać short link z serwisu Bitly (aby np. zbierać statystyki odnośnie klikalności) oraz wysłać WebHook do jakiś pre zdefiniowanych serwisów.
Przedstawionym przykładzie są tylko dwie akcje, w rzeczywistym świecie będzie ich więcej a przykład nie będzie aż tak banalny.
Zalety używania wzorca projektowa facade / fasada
Dzięki temu że w naszym przykładzie została użyta fasada, zyskaliśmy możliwość szybkiego oraz pewnego rozwoju tej części aplikacji.
Nie musimy się martwić że zmiana będzie widoczna tylko w jednym miejscu a w drugim już nie. Przykładowo, po miesiącu, project manager może przyjść i stwierdzić że musimy dodać wysyłkę maila o nowym poście do zarejestrowanych użytkowników. Jeżeli mamy fasadę to nic trudnego, wystarczy kilka linii kodu. W przypadku braku takiej centralizacji, może się to skończyć na dużym fackupie. Rozdzielenie kodu po wielu listenerach, serwisach itd. może spowodować bardzo duży chaos. Taki chaos powoli będzie powodował wydłużanie oraz skomplikowanie zadań.
Kolejną zaletą jest to że fasada może wywoływać kolejne fasady. Co za tym idzie może odizolować i grupować większe złożoności naszych podsystemów i/lub bibliotek.
Ostatnią zaletą która wymienię w tym wpisie jest to że korzystając z wzorca projektowego facade nie musimy się ograniczać tylko do akcji jak wyżej. Możemy równie dobrze łączyć funkcjonalności kilku bibliotek w jedną złożoną funkcjonalność która ograniczy nam złożoność kodu.
Świat nie jest taki kolorowy, to musi mieć wady
Jedną z wad facade, jest to że może być potraktowana zbyt ogólnie. Takie podejście będzie skutkować tym że nasz kod zacznie się robić coraz większym spaghetti. Nie wolno traktować fasady jako kotła do którego możemy wszystko wrzucić i super.
Jeszcze gorszą sytuacją może być złe zrozumienie odpowiedzialności fasady i przerzucenia odpowiedzialności z np. Controllera na facade itd.
Podsumowanie
Musisz pamiętać, że odpowiedzialnością facade jest zgrupowanie złożoności w daną prostą w implementacji metodę, a nie sterowanie całym procesem od przyjścia requestu do zwrócenia wyniku.
Korzystając z wzorców projektowych zawsze trzeba pamiętać żeby zachować umiar i zdrowy rozsądek. Wzorce projektowe nie powinny być wciskane na siłę, one powinny wychodzić w trakcie kodowania same z siebie.
Jeśli spodobał CI się ten wpis zapraszam Cię do przeczytania mojego wpisu o prototype lub adapterze 😉
Wiedzę czerpałem z: