Moje konto

Warstwy abstrakcji na przykładzie hotelu.

6 stycznia, 2023

Jak zrozumieć warstwy abstrakcji w swoim kodzie?

Wyobraź sobie piętra hotelu. Na parterze znajduje się recepcja, każdy z zewnątrz może wejść i zarezerwować pokój. Na tym poziomie nie można trzymać szczotek, zapasów jedzenia ani sprzętu. Recepcja ma być mała, a gdy klient czegoś potrzebuje, kontaktuje się ona z innym poziomem.

Na poziomie 2 mamy restaurację, z której mogą korzystać goście, ale tylko po wizycie w recepcji. Goście nie są bezpośrednio zainteresowani tym w jaki dokładnie sposób działa kuchnia, chcą natomiast poprosić o konkretne danie z karty i otrzymać zamówienie. Nie będą rozkładać sałatki na części pierwsze, po prostu ją skonsumują.

Żeby jednak możliwe było wykonanie posiłku, potrzebna jest kuchnia. Do kuchni dostęp mają tylko osoby uprawnione. Żaden gość nie może sobie tak po prostu wejść i wyciągnąć choćby liść sałaty. To, skąd pochodzą składniki jest tajemnicą hotelu i dla gościa nie jest to informacja istotna.

Ten 3 poziomowy przykład obrazuje nam jak mogą wyglądać poziomy abstrakcji w twojej aplikacji.

Przełożymy to na kod aplikacji dostarczającej API.

Kontroler – recepcja.

Każdy może wykonać zapytanie RESTowe do systemu. Nasz kontroler, podobnie jak recepcja, nie wykona jednak żadnej praktycznej operacji, poza przekazaniem danych i wywołaniem operacji na poziomie usługi. 

Service – restauracja.

Nasza recepcja (kontroler), dostarczyła nam informacji. Teraz czas na realizację usługi. To warstwa aplikacyjna – a w naszym przykładzie restauracja, która ma za zadanie zwracać nam konkretne wartości, sprawdzając przy tym czy jest to możliwe.

Repository – kuchnia.

Restauracja nie jest w stanie działać bez kuchni, ale to nie zadaniem gościa jest sprawdzać jakie składniki są dostępne. Repozytorium, zawierające te informacje dostarczy je do usługi, by ta mogła konkretnie odpowiedzieć na pytanie.

Co nie powinno stać się w naszym hotelu?

W żadnym wypadku recepcja nie powinna mieć dostępu do kuchni. To nie jest ich odpowiedzialność.

Operujesz na danych bezpośrednio w kontrolerze, nawet stosując repozytorium, a nie bezpośrednie modele? Nie rób tego!

Co może się wydarzyć?

Recepcja może dostać do zaoferowania nowe usługi. Nigdy jednak nie mogą być one łączone i realizowane przez recepcję. Tym zajmować będzie się konkretna usługa.

Hotel może zadecydować, że od dzisiaj goście mogą otrzymać posiłki do pokoju, albo zarezerwować stolik przez internet. Innymi słowy, punktem wejścia nie musi być kontroler, a może być aplikacja konsolowa, kolejka czy kanał websocketowy.

Podsumowanie.

Chcesz, żeby Twój kod działał skutecznie i realizował cele? Zadbaj o odpowiedzialność na odpowiednich warstwach.

W naszym przykładzie, korzystamy z bardzo prostej architektury 3 warstwowej. Nie zawsze będzie ona najlepszym wyborem.

Zapamiętaj jednak, by nie mieszać ze sobą odpowiedzialności w kodzie. Nie dopuszczaj do tego, że w Twoim kontrolerze znajduje się logika biznesowa, a tym bardziej bazodanowa.

Posted in Architecture, PHP, Programowanie
Related Posts