Quando si costruisce un pattern Observer, è necessario definire i propri eventi che vengono trasmessi e osservati. È meglio definire una classe astratta Event
con sottoclassi multiple per ogni evento, o definire un singolo enum, in cui ogni evento è elencato nell'enum?
opzione 1:
public abstract class Event { }
public UserInputEvent extends Event {}
public NetwortkEvent extends Event{}
opzione 2:
public enum Event {
USER_INPUT_EVENT,
NETWORK_EVENT
}
Ho visto esempi di entrambi:
Mi sto orientando verso l'opzione 2. Gran parte della mia decisione si basa sul fatto che sto lavorando in java, quindi potrebbe essere diverso per le diverse lingue:
- l'opzione 1 richiede un sacco di controlli
if X instanceOf Y
che sembrano brutti. - l'opzione 2 consentirà di pulire le istruzioni
switch
- l'opzione 2 elencherà tutti gli eventi possibili in un'unica posizione. So che la maggior parte degli IDE può mostrare tutte le sottoclassi di una classe, ma questo è meno ovvio.
- l'opzione 1 non limita l'aggiunta di più sottoclassi. Se stai scrivendo una libreria, qualsiasi utente della libreria può sottoclasse
Event
e ingombra il codice con più eventi. l'opzione 2 corregge il numero di eventi fino a quando qualcuno non aggiorna effettivamente l'enumerazione - l'opzione 1 consente gli eventi sub-sub, che possono essere buoni o cattivi. (ad esempio
public TouchUserInputEvent extends UserInputEvent {}
- l'opzione 1 ti consente di allegare ulteriori metadati all'evento. IMO questo può portare a codice ingombra se il tuo obiettivo è semplice.
come esempio:
public UserInputEvent extends Event {
int xLocation;
int yLocation;
}
UPDATE: Alla fine ho optato per l'opzione 1. Avevo bisogno di includere dati aggiuntivi nell'evento e usare una classe era l'unico modo per andare. Plush @whatsisname aveva ragione, dovendo recuperare i dati dell'evento aggiornato sarebbe il callback dell'inferno.