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) -
Term
ha 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 oggettoSchedule
che può comprendere e utilizzare oggettiTerm
. -
Box
creaTerm
oggetti e li passa aSchedule
come richiesto.Box
definisce anche le funzioniprint
memorizzate inTerm
. - Una funzione
print
di solito prende un argomento e lo usa per restituire una stringa basata su quell'argomento e i dati interni diTerm
. A volte la funzioneprint
potrebbe 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 funzioneprint
accedendo ai datishared
fino aSchedule
daBox
. 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 diTerm
o qualcosa del genere). Oppure associalo inSched
dopo cheBox
lo ha passato. E poi accedervi come un attributo diTerm
. - Inseriscilo nello stesso momento in cui
x
viene 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
bind
un 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).