Sto leggendo il libro "Learning TypeScript" di Remo Jansen. In una sezione l'autore descrive come creare un framework MVC proof-of-concept molto semplice che include come creare la classe Model
e dice quanto segue:
A model needs to be provided with the URL of the web service that it consumes. We are going to use a class decorator named ModelSettings to set the URL of the service to be consumed. We could inject the service URL via its constructor, but it is considered a bad practice to inject data (as opposed to a behavior) via a class constructor.
Non capisco quell'ultima frase. In particolare, non capisco cosa significhi "iniettare dati". Mi sembra che in quasi tutte le introduzioni alle classi JavaScript che utilizzano esempi semplificati, i dati siano introdotti ("iniettati"?) Nel costruttore tramite i suoi parametri. Ad esempio:
class Person {
constructor(name) {
this.name = name;
}
}
Penso certamente a name
come dati, non come comportamento, ed è universalmente incluso in questo tipo di esempio come parametro costruttore, e non c'è mai alcuna menzione che questa sia una cattiva pratica. Suppongo quindi di fraintendere qualcosa nella citazione sopra, sia che cosa si intenda per "dati" o per "inietti" o qualcos'altro.
Le tue risposte potrebbero includere spiegazioni su quando, dove, come e perché utilizzare i decoratori in JavaScript / TypeScript, poiché sospetto strongmente che il concetto sia intimamente connesso alla comprensione che cerco. Tuttavia, cosa più importante, voglio capire più in generale che cosa si intende iniettando dati tramite un costruttore di classi e perché è male.
Per dare più contesto alla citazione sopra, questa è la situazione: viene creata una classe Model
che, in questo esempio, verrà utilizzata per creare modelli di borsa, una per NASDAQ e una per 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 questa informazione, piuttosto che un parametro costruttore, che porta a quanto segue:
@ModelSettings("./data/nasdaq.json")
class NasdaqModel extends Model implements IModel {
constructor(metiator : IMediator) {
super(metiator);
}
...
}
Semplicemente 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) {...