Ho un design e mi sto chiedendo quale sia il modo appropriato per accedere alle variabili. Dimostrerò con questo esempio poiché non riesco a descriverlo meglio del titolo.
-
Termè un oggetto che rappresenta un gruppo di dati temporali (una durata di tempo ripetuta definita da un gruppo di attributi) -
Termha alcune funzionalità di stampa ma non implementa le funzioni di stampa, ma vengono passate come funzioni anonime dal genitore. Questo sarebbe simile a come gli shader possono essere passati a un renderer piuttosto che definiti dal renderer. - Un contenitore (chiamiamolo
Box) ha un oggettoScheduleche può comprendere e utilizzare oggettiTerm. -
BoxcreaTermoggetti e li passa aSchedulecome richiesto.Boxdefinisce anche le funzioniprintmemorizzate inTerm. - Una funzione
printdi solito prende un argomento e lo usa per restituire una stringa basata su quell'argomento e i dati interni diTerm. A volte la funzioneprintpotrebbe anche utilizzare i dati memorizzati inSchedule, però. Sto chiamando questo datoshared.
Quindi, la domanda è, qual è il modo migliore per accedere a questo shared di dati. Ho molte opzioni dal momento che JS ha delle chiusure e non conosco abbastanza bene per sapere se dovrei usarle o evitarle in questo caso.
Opzioni:
-
Crea un "riferimento" locale (termine usato con leggerezza) ai dati
shared(i dati non sono primitivi) quando definisci la funzioneprintaccedendo ai datisharedfino aScheduledaBox. Esempio:var schedule = function(){ var sched = Schedule(); var t1 = Term( function(x){ // Term.print() return (x + sched.data).format(); }); }; -
Collegalo esplicitamente a
Term. (Passalo nel costruttore diTermo qualcosa del genere). Oppure associalo inScheddopo cheBoxlo ha passato. E poi accedervi come un attributo diTerm. - Inseriscilo nello stesso momento in cui
xviene passato alla funzione di stampa, (da sched). Questo è il modo più familiare per il mio, ma non mi sembra giusto data la capacità di chiusura di JS. - Fai qualcosa di strano come
bindun po 'di contesto e argomenti aprint.
Spero che la risposta corretta non sia puramente soggettiva. Se lo è, suppongo che la risposta sia "fai tutto ciò che funziona". Ma sento che ci sono alcune differenze significative tra gli approcci che potrebbero avere un grande impatto quando si estendono oltre il mio piccolo esempio.
Modifica
Pubblicherò la soluzione che sto usando, ma vorrei ancora esprimere critiche:
Tutte le funzioni print prendono, come argomenti, tutto ciò che term non possiede. In questo modo, term non è accoppiato a schedule in alcun modo (ovviamente schedule dipende ancora da term , comunque). Ciò consente a term di essere inizializzato / costruito ovunque senza bisogno di conoscere la pianificazione.
Quindi, se term ha una funzione init() , potrebbe richiedere un oggetto simile a questo:
{
inc: moment.duration(1,"d"),
periods: 3,
class: "long",
text:"Weekly",
pRange: moment.duration(7,'d'),
//*...other attr*//
printInc: function(increments,period){
return moment(this.start).add(this.inc.product(increments)
.add(this.startGap))
.add(this.pRange.product(period))
.format(DATEDISPLAYFORMAT);
},
printLabel: function(datetime){
return (datetime).format(DATEDISPLAYFORMAT);
}
}
Dove incremento, punto, data / ora passerebbero tutti da qualunque cosa stia usando i metodi di stampa del termine (pianificazione in questo caso).