Sto lavorando a un progetto in cui devo monitorare lo stato di un ascensore. Finora, il mio design ha questo aspetto:
Stiamoutilizzandounalibreriaditerzepartiperleggereemonitorareivaloriintemporealedallogiccontrollerdell'elevatore.Untag
èunvaloreinteroinunregistrodimemoriadellogiccontroller.Adesempio,DM140
contieneladirezionedell'elevatore.
Usounlivelloadattatoripermantenereisolatoildominiodell'applicazionedallalibreriaditerzeparti.
Neldominio,ElevatorDirectionMonitor
prendeilvaloreinteroElevatorTag
,estrapolaladirezionecorrentedell'elevatoreepoinotificaaisuoiclienticheladirezionedell'elevatoreècambiata.Finqui,tuttobene.
Eccoilmioproblema:cisarannounsacco(uncentinaioopiù)ditipidiinformazionidamonitoraredall'ascensore,comeilpavimentocorrente,seleportesonoaperte/chiuse,ecc.Secontinuocosì,Dovròcreareunaclassedimonitorperognitipodiinformazionechevogliomonitorare(adesempio,ElevatorFrontDoorStatusMonitor
,ElevatorRearDoorStatusMonitor
)eognimonitorassociatoallapropriainterfacciaObserver.Questosignificamoltolavoro.Hocercatoditrovareunaltromodoperstrutturarelamiaapplicazione,manonhotrovatonulladipiù"elegante".
La logica di base in ogni classe di monitor sarebbe praticamente la stessa su tutta la linea: ascoltare la modifica del valore su un'istanza ElevatorTag
, estrapolare le informazioni dal nuovo valore del tag e quindi notificare gli osservatori. Il problema sembra derivare dal fatto che ogni classe di osservatori deve avere una firma di interfaccia diversa (ad esempio ElevatorDirectionObserver
ha NotifyDirectionChanged(ElevatorDirection newDirection)
quando DoorStatusMonitor
avrebbe piuttosto qualcosa di simile a NotifyDoorStatusChanged(DoorPosition frontOrRear, DoorStatus openOrClosed)
).
Pensi che la soluzione su cui sto lavorando sia accettabile. In caso contrario, qualcuno potrebbe suggerire quali schemi dovrei usare o investigare, o qualcosa che potrebbe aiutarmi a semplificare il mio design?