Przykład
Biznes decyduje się by konkretni użytkownicy mieli naliczani rabat do robionego zamówienia. W tym wpisie nie będę się skupiał na naliczaniu samego rabatu, tylko na to komu ma on zostać przyznany. Poniżej znajduje się najprostsza implementacja tego zadania:
namespace App\Context\Application; final class OrderService { // ... public function createOrder( //... User $user ): void { // ... if (in_array($user->id(), [101,102])) { // give a discount } // ... } }
Jak widać rabat dotyczy tylko użytkowników z ID 101 & 102.❌ Serwis Aplikacyjny ma teraz wiedzę o konkretnych ID z bazy MySQL, które nie powinny wychodzić poza Warstwę Infrastruktury. Można by utworzyć dodatkową klasę, która hermetyzowała by identyfikatory, ale tak czy inaczej musiałaby się znaleźć w Warstwie Aplikacji (lub co gorsza Domeny). Najprostrzym rozwiązaniem będzie wprowadzenie wyspecjalizowanego Repozytorium składającego się na interfejs:
namespace App\Context\Application\Repository; interface UserDiscountRepository { public function discountAllowed(int $userId): bool; }
Oraz jego implementacji InMemory:
namespace App\Context\Infrastructure\Repository; use App\Context\Application\Repository\UserDiscountRepository; final class UserDiscountInMemoryRepository implements UserDiscountRepository { public function discountAllowed(int $userId): bool { return in_array($userId, [101,102]); } }
Wystarczy dodać zależność w postaci UserDiscountRepository do Serwisu Aplikacyjnego. W przypadku gdy będziemy rozwijać funkcjonalność, a użytkownicy z naliczanym rabatem będą dodawani do systemu dynamicznie - implementacja OrderService nie powinna ulec zmianie.
namespace App\Context\Application; use App\Context\Application\Repository\UserDiscountRepository; final class OrderService { public function __construct( private UserDiscountRepository $userDiscountRepository ) {} // ... public function createOrder( //... User $user ): void { // ... if ($this->userDiscountRepository->discountAllowed($user->id())) { // give a discount } // ... } }
Brak komentarzy:
Prześlij komentarz