Il problema: lo switch sullo stato che divora il codice

Un ordine in un e-commerce ha diversi stati: draft, pending, paid, shipped, delivered, cancelled, refunded. Ogni operazione dipende dallo stato corrente: puoi pagare un ordine solo se e pending, puoi spedire solo se e paid, puoi cancellare solo se non e già shipped. Il codice diventa una cascata di if ($this->status === 'pending') in ogni metodo.

Il metodo cancel() controlla se lo stato permette la cancellazione. Il metodo ship() controlla se lo stato permette la spedizione. Il metodo refund() controlla se lo stato permette il rimborso. Ogni nuovo stato o nuova operazione richiede di aggiornare tutti i metodi. Ogni nuova transizione richiede di aggiornare tutti i controlli. La complessità cresce come il prodotto di stati per operazioni: 7 stati e 6 operazioni significano 42 condizioni da gestire e mantenere sincronizzate.

Cos'e lo State Pattern: definizione formale

Il Gang of Four definisce lo State come un pattern comportamentale che "permette a un oggetto di alterare il proprio comportamento quando il suo stato interno cambia. L'oggetto sembrera cambiare la propria classe". La struttura prevede tre attori: