Sobes.tech
Junior — Middle

Czy możesz podać przykład najtrudniejszego dla ciebie wzorca projektowego, którego używałeś w praktyce?

sobes.tech AI

Odpowiedź od AI

Jednym z najbardziej skomplikowanych wzorców projektowych, z którymi miałem do czynienia w PHP, jest wzorzec "Stan" (State). Ten wzorzec pozwala obiektowi zmieniać swoje zachowanie w zależności od jego wewnętrznego stanu, nie zmieniając przy tym swojej klasy.

Przykład użycia: miałem projekt z systemem zamówień, gdzie zamówienie mogło znajdować się w różnych stanach (nowe, opłacone, wysłane, anulowane). Zamiast wielu instrukcji warunkowych, zaimplementowałem każdy stan jako osobną klasę, implementującą wspólny interfejs, i dynamicznie zmieniałem stan zamówienia.

interface OrderState {
    public function proceed(OrderContext $order);
}

class NewOrderState implements OrderState {
    public function proceed(OrderContext $order) {
        // logika przejścia do stanu "opłacony"
        $order->setState(new PaidOrderState());
    }
}

class PaidOrderState implements OrderState {
    public function proceed(OrderContext $order) {
        // logika przejścia do stanu "wysłane"
        $order->setState(new ShippedOrderState());
    }
}

class OrderContext {
    private $state;

    public function __construct(OrderState $state) {
        $this->state = $state;
    }

    public function setState(OrderState $state) {
        $this->state = $state;
    }

    public function proceed() {
        $this->state->proceed($this);
    }
}

// Użycie
$order = new OrderContext(new NewOrderState());
$order->proceed(); // przechodzi do PaidOrderState
$order->proceed(); // przechodzi do ShippedOrderState

Ten wzorzec jest skomplikowany, ponieważ wymaga dobrej znajomości zasad OOP i poprawnego projektowania klas do zarządzania stanami, ale znacznie poprawia czytelność i rozszerzalność kodu.