Voglio aggiungere funzionalità per una classe astratta Model
per inviare eventi ogni volta che si aggiorna. Per poter inviare eventi, è necessario avere accesso a un EventManager
. Pertanto, l'intento era innanzitutto quello di essere in grado di gestire gli eventi (ad esempio, l'operazione di salvataggio) e la seconda di inviare eventi al gestore di eventi di sistema.
Il mio approccio è implementare una nuova interfaccia EventManagerAware
in ExistingModel
class, che richiede questo comportamento, come questo:
interface EventManagerAware {
public function handleEvent(EventManager em);
}
class ExistingModel extends Model implements EventManagerAware {
public function handleEvent(EventManager em) {
em.sendEvent(Event::SAVE);
}
}
abstract class Model() {
public function save() {
if (this instanceOf EventManagerAware) {
this.handleEvent(this.getServiceManager().getEventManager());
}
}
Dopo la revisione, qualcuno ha sostenuto che è meglio estendere solo la classe Model
, sovrascrivere il metodo save()
e modificare ExistingModel
dall'estensione di Model
a EventPublisherModel
class, in questo modo:
class EventPublisherModel extends Model {
public function save() {
this.getServiceManager().getEventManager().sendEvent(Event::SAVE);
}
}
class ExistingModel extends EventPublisherModel {
}
FYI, la classe Model
esistente ha il seguente aspetto:
abstract class Model {
protected ServiceManager serviceManager;
public function __construct(ServiceManager sm) {
this.serviceManager = sm;
}
public function getServiceManager() {
return this.serviceManager;
}
public function save() {
}
}
Uno degli argomenti messi per avere la classe EventPublisherModel
era perché facendo il primo approccio, tutti gli oggetti Model avrebbero controllato EventManagerService
quando facevano save()
operazione, e questo non è necessario.
Non ho mai veramente pensato al motivo per cui il primo approccio sarebbe stato migliore, ma ho pensato che ho segmentato l'interfaccia e non pensavo che l'ereditarietà fosse necessaria perché l'invio degli eventi è in un dominio diverso dalla classe Model
.
Qual è il modo migliore per farlo e perché?