Modelli per consentire ganci di flusso di dati versatili in Javascript

4

Ho un'applicazione in cui mi piacerebbe aggiungere modi per moduli / componenti esterni per hook durante i processi e il flusso di dati ed eseguire azioni / modificare dati.

Per il primo requisito - eseguire azioni - presumo che lo schema migliore sarebbe quello di emettere eventi e avere altri moduli / componenti di sottoscrivere tali eventi ed eseguire le loro azioni, correggere?

Il secondo requisito è dove diventa molto difficile per me, cercherò di spiegarlo con un esempio:

someObject = {
    ... // properties and stuff
    performComputation: function() {
       let data = this.data;

       return this.x * data.amount;
    }
}

Ora, voglio un modo per eseguire modifiche dinamiche su qualche valore di quella funzione, e forse il valore return . Quello che voglio ottenere è molto simile a ciò che WordPress fa con filter hook . WordPress mantiene una serie di callback per chiamare in un certo ordine per consentire la manipolazione dei dati. Se implemento qualcosa di simile, il mio codice sarebbe simile a questo:

someObject = {
    ... // properties and stuff
    performComputation: function() {
       let data = applyFilters('computationData', this.data);

       return applyFilters('computationResult', this.x * data.amount);
    }
}

e potrei quindi collegarlo utilizzando un'API che sarebbe simile a questa:

addFilter('computationResult', (res) => { return res * 2; });

Questo ovviamente funziona, ma dal fatto che non ho mai visto questo pattern utilizzato in nessuna libreria JS e il fatto che con ore di ricerca non ho trovato nessuno che implementasse un semplice modulo di nodo al riguardo, ho l'impressione che questo potrebbe essere un anti-pattern che dovrei evitare (capisco che può diventare complicato e difficile da eseguire il debug, ad esempio).

Quindi, ecco le mie domande:

  1. Come si chiama questo modello? Forse non so come cercarlo.
  2. Questo ha a che fare con Programmazione orientata agli aspetti ?
  3. Sarebbe un approccio di pattern migliore a cui non sto pensando che soddisfi le mie esigenze? In particolare: (1) aggancio in parti delle applicazioni per manipolare i dati (2) gli hook devono essere aggiunti e rimossi abbastanza spesso durante l'interazione dell'utente con l'applicazione.

Modifica

Sembra che il mio obiettivo venga frainteso, quindi cercherò di spiegarlo meglio. L'invio Osservabile o l'invio Evento mi consente di eseguire codice nell'esecuzione di un altro codice. Tuttavia, il motivo per cui non è abbastanza per me è perché gli osservatori non restituiscono valori che possono essere manipolati.

Come per AOP, come sottolineato dalla risposta di Candied Orange , l'obiettivo non sa che è stato agganciato sopra. Anche questo non è il mio obiettivo.

Il mio obiettivo è che una funzione esporti determinate parti di dati per altre funzioni in hook e manipoli .

Ancora, con un altro esempio di pseudo-codice:

someObject = {
    name: "Jim",
    greet: function(str) {
        let greeting = applyFilters('greeting', str);

        return '${greeting} I am ${name}.';
    }
}

addFilter('greeting', (str) => { return str.toUppercase(); });
addFilter('greeting', (str) => { return str + "!!"; });

someObject.greet("Hello"); // => HELLO!! I am Jim.

Questo è il tipo di funzionalità di cui ho bisogno e può essere facilmente implementato con iterazioni sui callback come ho detto, ma non sono sicuro che questo sia in alcun modo un buon modello o se ho alternative per raggiungere questo obiettivo.

    
posta Sunyatasattva 05.08.2016 - 04:59
fonte

3 risposte

1

Ho già scritto un software che usa l'approccio che descrivi da wordpress (interessante, il software su cui stavo lavorando quando ho ideato autonomamente era anche un sistema PHP CMS ... Mi chiedo se c'è qualcosa riguardo al requisiti di quel tipo di sistema che ti spingono verso la soluzione più là che in altri ambienti?). Ho anche lavorato in ambienti che utilizzano la Programmazione Aspect Oriented pesantemente (ad esempio il framework Spring per Java) e posso vedere che i due sono decisamente molto simili. L'approccio del filtro plug-in wordpress è essenzialmente equivalente a un pointcut di esecuzione post implementato manualmente in AOP.

Entrambi sono modi molto flessibili e facili da usare per introdurre il potenziale di personalizzazione del codice. Ma è molto facile confondersi su come funziona il sistema - assicurati di tenere traccia di come ciascuna caratteristica si costruisce sugli altri e su quali filtri utilizza, perché puoi ottenere interazioni impreviste tra i moduli e rintracciarli senza documentazione di cosa modifica quale risultato può essere complicato.

L'unico altro consiglio sarebbe che se si desidera utilizzare un approccio AOP, perché farlo manualmente? Esistono implementazioni basate su javascript di AOP (ad esempio questo ), e l'utilizzo di una di queste potrebbe consentire di ridurre la replica che Finiremo inevitabilmente per costruire e gestire il tuo elenco di hook e chiamarlo ovunque ti serva.

    
risposta data 05.12.2016 - 07:35
fonte
0

Hooking , o creazione di gli hook significano un cambiamento nel comportamento del software modificando il suo codice binario. Il programma di destinazione non ha nemmeno bisogno di essere progettato per consentire questo. Dove il programma utilizzato per eseguire un'operazione in questa posizione, lo si modifica per eseguire un altro. Questo è un gancio.

Quando questo diventa confuso è quando si inizia ad applicare questo termine al codice sorgente che fa la stessa cosa. Una tabella virtuale in c ++ deve essere modificata in modo che le chiamate a funzioni / metodi astratti possano essere inviate in modo polimorfico a diverse funzioni / metodi concreti. È un gancio? Beh sì, un po ', ma è il linker che sta facendo il hooking, non il codice sorgente che ha chiesto il tavolo virtuale.

Ma il mondo della programmazione è selvaggio e lanoso quindi non aspettatevi che tutti abbiano una visione tanto ristretta di ciò che realmente sono i ganci come faccio io. Quando qualcuno descrive i metodi in un modello di strategia come ami, non li correggo. Mi sposto.

Quindi quando dici che vuoi una serie di callback, riconoscerò a malincuore che il ciclo di questo set di "hook" equivale a un modello orientato agli oggetti chiamato osservatore . Questo è davvero un evento. Usando questo modello non significa importanza se i dati vengono modificati su un thread diverso dagli osservatori (i "ganci").

Di tutto ciò che hai menzionato Aspect Oriented Programming (AOP) è il più vicino ai veri hook. L'obiettivo di AOP non ha bisogno di avere alcuna idea che AOP sia utilizzato su di esso. A differenza dell'ereditarietà, della composizione, dell'iniezione delle dipendenze, o persino dei setter e dei getter, l'obiettivo di AOP non deve essere progettato per accettare gli hook.

Tuttavia, stai lavorando in javascript. Dovrei avvertirti che gran parte di ciò che provi viene dal mondo della programmazione java e orientata agli oggetti.

Nel mondo javascript hai un accesso migliore alla programmazione funzionale. Con la programmazione funzionale, molti modelli di design semplicemente non sono necessari. Ti consigliamo di consultare programmazione reattiva funzionale . Risolve molti degli stessi problemi con gli eventi, ma dovrebbe essere più naturale in javascript, quindi provare a mappare le soluzioni orientate agli oggetti in punti in cui non sono realmente necessari.

    
risposta data 05.08.2016 - 08:00
fonte
0

Uno dei migliori articoli che ho letto su questo argomento è di Ebay, qui:

link

Descrivono come useranno jQuery come un dispatcher di eventi per comunicare tra moduli discreti. Ma suggeriscono anche un'alternativa sarebbe quella di utilizzare un mediatore di eventi dedicato per coordinare gli eventi di tutte le diverse componenti.

Naturalmente quadri moderni come Angular e React / Redux hanno dei modi piuttosto tesi ma collaudati per comunicare tra le parti del tuo software. Trascorrere molto tempo a studiare tutti i moderni framework JavaScript, SO MUCH è cambiato di recente.

    
risposta data 05.08.2016 - 09:10
fonte

Leggi altre domande sui tag