Spesso mi imbatto in questo problema.
Supponi di avere un modulo con alcuni controlli:
A
B
C = A + B
D
E = C * 2 ONLY IF D==TRUE
F
G = A - F
L'utente riempie A, poi B.
Il sistema calcola C.
L'utente riempie D (booleano)
Il sistema calcola E
L'utente riempie F
Il sistema calcola G
Ma ora:
L'utente cancella un annuncio
Il sistema cancella C, E e G
L'utente cancella il B
Il sistema non fa niente
L'utente inserisce un annuncio
Il sistema ricalcola solo F
E così di seguito.
C'è chiaramente un albero di dipendenze, e non è difficile da capire.
Ma pragmaticamente ho trovato abbastanza difficile implementarlo senza "framework" per modellarlo.
Che siano input in un modulo HTML o controlli in un'applicazione javafx, il problema di creare un algoritmo completo di "ricalcolo" rimane ancora.
(Javafx offre un'architettura "vincolante" che, nonostante sia un po 'prolissa, è tuttavia molto potente e indirizza (parte di) questo specifico problema).
Ma sono più interessato a una metodologia che può essere utilizzata attraverso le diverse piattaforme.
Io uso un sacco di tecniche per risolvere i problemi che si presentano ma non ancora una metodologia, che è un modo per passare dalla definizione all'implementazione con la quantità minima di prove.
Le tecniche sono le buone vecchie: invalidazioni, init pigro, che avvolge ogni controllo in un 'nodo' di un grafico di ricalcatura.
Ma sento che ci dovrebbe essere un approccio più canonico a questo problema ricorrente, e un documento in cui questo approccio è spiegato e così via.
Qualcuno mi può suggerire dove posso trovare tali informazioni?
MODIFICA 1: termini del problema
- Uno degli obiettivi chiave di tale soluzione è avere un modo per organizzare il codice in modo prevedibile, in modo che, conoscendo il metodo, dovrebbe essere facile valutarne la correttezza.
- Stato iniziale: molti sistemi non riescono a tornare al loro stato iniziale, questo è l'odore di un design scadente che tale metodologia dovrebbe impedire
- Dovrebbe essere progettato per casi reali come (riprendendo l'esempio): quando l'utente cambia A, il sistema dovrebbe cancellare B nel caso in cui erano accoppiati. È facile pensare a questi casi: un utente seleziona un contry e il sistema fornisce un elenco di regioni che l'utente può scegliere. Se l'utente cambia città, la regione precedentemente scelta deve essere cancellata anche se non è strettamente un campo dipendente poiché non viene calcolata dal sistema.
Come esempio di una soluzione molto parziale:
-
Ogni controllo dovrebbe avere un metodo di 'aggiornamento' di supporto che dovrebbe attivare solo l'aggiornamento dei controlli 'collegati direttamente'. Questa ipotesi dovrebbe garantire che quando C è basato su A, A è sempre aggiornato.
function update_A () { update_C; }
function update_B () { update_C; }
function update_C () { C.setValue (A + B); update_E (); }
ecc. ecc.
-
poiché non ci devono essere riferimenti circolari, questa funzione di aggiornamento dovrebbe formare un 'albero'.
Altri contributi a venire.