Ho un algoritmo iterativo e voglio stampare i progressi. Tuttavia, potrei anche volere che non stampi qualsiasi informazione, o stamparla in altro modo, o fare altra logica. In un linguaggio orientato agli oggetti, eseguirò le seguenti soluzioni:
Soluzione 1: metodo virtuale
avere la classe dell'algoritmo MyAlgoClass che implementa l'algo. La classe implementa anche un metodo di reportIteration virtuale (iterInfo) che è vuoto e può essere reimplementato. Sottoclassi MyAlgoClass e sovrascrivi reportIteration in modo che faccia ciò che deve fare. Questa soluzione consente di portare ulteriori informazioni (ad esempio, l'unità di file) nella classe reimplementata.
Non mi piace questo metodo perché raggruppa due funzionalità che potrebbero non essere correlate, ma nelle app GUI potrebbe essere ok.
Soluzione 2: schema osservatore
la classe dell'algoritmo ha un metodo di registro (Observer), mantiene una lista degli osservatori registrati e si occupa di chiamare notify () su ciascuno di essi. Observer :: notify () ha bisogno di un modo per ottenere le informazioni dal Soggetto, quindi ha due parametri, uno con il Soggetto e l'altro con i dati che il Soggetto può superare, o solo il Soggetto e l'Osservatore è ora in carica di interrogarlo per recuperare le informazioni pertinenti.
Soluzione 3: callback
Tendo a vedere il metodo di callback come un osservatore leggero. Invece di passare un oggetto, si passa un callback, che può essere una funzione semplice, ma anche un metodo di istanza in quei linguaggi che lo consentono (ad esempio, in python è possibile perché passare un metodo di istanza rimarrà legato all'istanza). C ++ tuttavia non lo consente, perché se si passa un puntatore a un metodo di istanza, this
non verrà definito. Per favore correggimi a riguardo, il mio C ++ è piuttosto vecchio.
Il problema con i callback è che generalmente devi passarli insieme ai dati con cui vuoi richiamare il callback. Le callback non memorizzano lo stato, quindi devi passare sia la callback che lo stato a Subject
per trovarlo durante l'esecuzione del callback, insieme a eventuali dati aggiuntivi che Subject
può fornire sull'evento che sta segnalando.
Domanda
La mia domanda è relativa al fatto che ho bisogno di implementare il problema di apertura in un linguaggio che non è orientato agli oggetti, ovvero Fortran 95, e sto combattendo con il mio solito ragionamento basato su ipotesi e stile di Python. Penso che in Fortran il concetto sia simile a C, con il guaio aggiuntivo che in C puoi memorizzare un puntatore a funzione, mentre in Fortran 95 puoi solo passarlo in giro.
Hai commenti, suggerimenti, suggerimenti e stranezze a riguardo (in C, C ++, Fortran e python, ma anche in qualsiasi altra lingua, così da avere un confronto tra le caratteristiche linguistiche che possono essere sfruttate a questo proposito ) su come progettare un algoritmo che deve riportare l'avanzamento su qualche entità esterna, usando lo stato sia dall'algoritmo che dall'entità esterna?