Citando direttamente the paper:
Per illustrare i problemi precisi del modello dell'osservatore, si comincia con una semplice e onnipresente esempio: trascinamento del mouse. L'esempio seguente traccia gli spostamenti del mouse durante un'operazione di trascinamento in un oggetto Path
e visualizza sullo schermo. Per semplificare le cose, utilizziamo le chiusure Scala come osservatori.
var path: Path = null
val moveObserver = { (event: MouseEvent) =>
path.lineTo(event.position)
draw(path)
}
control.addMouseDownObserver { event =>
path = new Path(event.position)
control.addMouseMoveObserver(moveObserver)
}
control.addMouseUpObserver { event =>
control.removeMouseMoveObserver(moveObserver)
path.close()
draw(path)
}
L'esempio di cui sopra, e come avremo modo di discutere l'osservatore modello come definito in [25], in generale, viola un impressionante line-up di importanti principi dell'ingegneria del software:
effetti collaterali Gli osservatori promuovono effetti collaterali. Poiché gli osservatori sono senza stato, spesso abbiamo bisogno di alcuni di essi per simulare lo stato come nell'esempio di trascinamento. Dobbiamo salvare lo stato in cui è accessibile a tutti gli osservatori coinvolti come nella variabile path
precedente.
Encapsulation Come variabile di stato path
sfugge la portata degli osservatori, il modello dell'osservatore rompe incapsulamento.
Composability osservatori più formano una raccolta disomogenea di oggetti che si occupano di un singolo problema (o multipla, vedi punto successivo). Dal momento che più osservatori sono installati a punti diversi in momenti diversi, ad esempio , non è possibile, ad esempio, smaltirli completamente.
separazione degli interessi Gli osservatori sopra non solo tracce percorso mouse, ma anche chiamare un comando di disegno, o più in generale, comprende due preoccupazioni differenti nella stessa posizione del codice . Spesso è preferibile separare le preoccupazioni di costruire il percorso e visualizzarlo, ad esempio come nel modello model-view-controller (MVC) [30].
Scalabilità Potremmo realizzare una separazione degli interessi nel nostro esempio creando una classe per i percorsi che si pubblica eventi quando il tracciato cambia. Sfortunatamente, non esiste una garanzia per la coerenza dei dati nel modello di osservatore. Supponiamo di creare un altro evento che pubblica l'oggetto che dipende dalle modifiche nel nostro percorso originale, ad esempio un rettangolo che rappresenta i limiti del nostro percorso. Inoltre, considera un osservatore che ascolta i cambiamenti sia nel percorso sia nei suoi limiti per disegnare un percorso con cornice. L'osservatore avrebbe dovuto manualmente determinare se i limiti sono già aggiornati e, in caso contrario, rinviare l'operazione di disegno . Altrimenti l'utente può osservare un frame su lo schermo che ha la dimensione sbagliata (un glitch).
Uniformità diversi metodi per installare diversi osservatori codice diminuzione uniformità.
Astrazione C'è un basso livello di astrazione nell'esempio. Si basa su un'interfaccia pesante di una classe di controllo che fornisce più di semplici metodi specifici per installare osservatori di eventi del mouse . Pertanto, non possiamo astrarre sulle fonti di eventi precise. Ad esempio, potrebbe consentire all'utente di interrompere un'operazione di trascinamento premendo la chiave di escape o utilizzare un dispositivo di puntatore diverso, ad esempio uno schermo tattile o una tavoletta grafica touch .
Gestione risorse La durata di un osservatore deve essere gestita dai clienti. Per motivi di prestazioni, vogliamo osservare gli eventi di spostamento del mouse solo durante un'operazione di trascinamento . Pertanto, dobbiamo installare esplicitamente e disinstallare l'osservatore di spostamento del mouse e abbiamo bisogno di ricordare il punto di installazione (controllo sopra).
distanza semantica In definitiva, l'esempio è difficile capire perché il flusso di controllo viene invertito che si traduce in codice standard troppo che aumenta la distanza semantica tra l'intenzione programmatori e il codice effettivo.
[25] E. Gamma, R. Helm, R. Johnson e J. Vlissides. Modelli di disegno : elementi del software orientato agli oggetti riutilizzabile. Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA, 1995. ISBN 0-201-63361-2.
Discusso anche qui ... http://lambda-the-ultimate.org/node/4028 –