Sto leggendo il libro "Learning TypeScript" di Remo Jansen. In una sezione l'autore descrive come creare un framework MVC di prova del concetto molto semplice, incluso come creare la Model
classe e dice quanto segue:
È necessario fornire un modello con l'URL del servizio Web che consuma. Useremo un decoratore di classe chiamato ModelSettings per impostare l'URL del servizio da consumare. Potremmo iniettare l'URL del servizio tramite il suo costruttore, ma è considerata una cattiva pratica iniettare dati (al contrario di un comportamento) tramite un costruttore di classi .
Non capisco quest'ultima frase. In particolare, non capisco cosa significhi "iniettare dati". Mi sembra che in quasi tutte le introduzioni alle classi JavaScript utilizzando esempi troppo semplificati, i dati vengono introdotti ("iniettati"?) Nel costruttore tramite i suoi parametri. Per esempio:
class Person {
constructor(name) {
this.name = name;
}
}
Penso certamente name
ai dati, non al comportamento, ed è universalmente incluso in questo tipo di esempio come parametro del costruttore, e non si fa mai menzione del fatto che si tratta di una cattiva pratica. Suppongo quindi di aver frainteso qualcosa nella citazione sopra, o cosa si intende per "dati" o per "iniettare" o qualcos'altro.
Le tue risposte potrebbero includere spiegazioni su quando, dove, come e perché utilizzare i decoratori in JavaScript / TypeScript, poiché sospetto fortemente che il concetto sia intimamente connesso alla comprensione che cerco. Tuttavia, cosa ancora più importante, voglio capire più in generale cosa si intende iniettando dati tramite un costruttore di classi e perché ciò non va bene.
Per dare più contesto alla quotazione sopra, questa è la situazione: Model
viene creata una classe che, in questo esempio, verrà utilizzata per creare modelli di borsa, uno per il NASDAQ e uno per il NYSE. Ogni modello richiede il percorso del servizio Web o del file di dati statici che fornirà i dati non elaborati. Il libro afferma che un decoratore dovrebbe essere usato per queste informazioni, piuttosto che un parametro del costruttore, portando a quanto segue:
@ModelSettings("./data/nasdaq.json")
class NasdaqModel extends Model implements IModel {
constructor(metiator : IMediator) {
super(metiator);
}
...
}
Non ho capito perché dovrei aggiungere l'URL del servizio tramite il decoratore piuttosto che semplicemente come parametro per il costruttore, ad es.
constructor(metiator : IMediator, serviceUrl : string) {...