In OOP quale oggetto è comune aggiornare lo stato di un oggetto quando si lavora con macchine di stato?

3

Sto per implementare la mia prima macchina a stati e mi rimane una domanda, che è il modulo di codifica accettabile su chi dovrebbe cambiare lo stato dell'oggetto / entità? La StateMachine dovrebbe cambiare lo stato? L'oggetto stesso dovrebbe cambiare il proprio stato? Se un sevice (ad esempio IncidentTicketService) modifica lo stato dell'entità (IncidentTicket)?

Esempio concreto

public enum IncidentState {
    OPEN, CLOSED, CANCELLED, PENDING
}

...

public class IncidentTicket {
   private String state;
}

...

public IncidentTicketStateMachine {
   // code here depends if this object is doing the state change, or 
   // just indicating which are the next/previous states based on the 
   // provided object in a constructor... I guess.
}

...

# only if this is common practice to change the state of the object
public class IncidentService {

   private IncidentTicket incidentTicket;

   public IncidentService(IncidentTicket incidentTicket) {
      this.incidentTicket = incidentTicket;
   }

   public void nextState() {
      this.incidentTicket.setStatus(....);
}

...

Non mi interessa codificarlo in entrambi i modi (oggetto cambia stato vs macchina di stato), sto chiedendo poiché voglio scoprire quale dei due è più comune?

Grazie

    
posta Jose Leon 03.10.2016 - 17:48
fonte

1 risposta

4

Questo mi sembra ovvio. Mentre l'entità oggetto è responsabile della memorizzazione dello stato, la stessa macchina di stato è responsabile della gestione dello stato.

Non si tratta di "qual è il più comune", però. La popolarità è raramente un buon modo per prendere decisioni. Si tratta di fare la cosa che meglio risolve il tuo problema specifico.

A titolo di esempio, immagina di estrarre denaro da un conto corrente utilizzando un bancomat. Non ti aspetteresti mai che il tuo portafoglio fosse in grado di sapere quanti soldi contiene, né ti aspetteresti che il denaro si estraesse dal tuo account.

Detto questo, nulla ti impedisce di collegare qualche logica di aiuto alla tua entità. Ma alla fine penso che la responsabilità di mantenere e interpretare lo stato spetti al Motore di Stato, non all'entità.

    
risposta data 03.10.2016 - 18:17
fonte

Leggi altre domande sui tag