Czytam książkę „Learning TypeScript” Remo Jansena. W jednej sekcji autor opisuje, jak stworzyć bardzo prosty framework MVC typu proof-of-concept, w tym jak stworzyć Model
klasę i mówi:
Do modelu należy podać adres URL usługi internetowej, z której korzysta. Użyjemy dekoratora klasy o nazwie ModelSettings, aby ustawić adres URL usługi, która ma być używana. Możemy wstrzyknąć adres URL usługi za pośrednictwem konstruktora, ale uważa się za złą praktykę wstrzykiwanie danych (w przeciwieństwie do zachowania) za pomocą konstruktora klasy .
Nie rozumiem tego ostatniego zdania. W szczególności nie rozumiem, co to znaczy „wstrzykiwać dane”. Wydaje mi się, że w prawie wszystkich wprowadzeniach do klas JavaScript wykorzystujących zbyt uproszczone przykłady dane są wprowadzane („wstrzykiwane”?) Do konstruktora za pomocą jego parametrów. Na przykład:
class Person {
constructor(name) {
this.name = name;
}
}
Z pewnością myślę o name
danych, a nie o zachowaniu, i są one powszechnie zawarte w tym przykładzie jako parametr konstruktora, i nigdy nie ma wzmianki, że jest to zła praktyka. Zakładam więc, że nie rozumiem czegoś w powyższym cytacie, co oznacza „dane”, „zastrzyk” lub coś innego.
Twoje odpowiedzi mogą zawierać wyjaśnienia, kiedy, gdzie, jak i dlaczego używać dekoratorów w JavaScript / TypeScript, ponieważ mocno podejrzewam, że ta koncepcja jest ściśle związana ze zrozumieniem, którego szukam. Co ważniejsze, chcę bardziej ogólnie zrozumieć, co oznacza wstrzykiwanie danych za pomocą konstruktora klas i dlaczego jest to złe.
Aby dać więcej kontekstu powyższemu cytatowi, taka jest sytuacja: Model
tworzona jest klasa, która w tym przykładzie zostanie wykorzystana do stworzenia modeli giełdowych, jednej dla NASDAQ i jednej dla NYSE. Każdy model wymaga ścieżki usługi sieciowej lub pliku danych statycznych, który dostarczy surowych danych. Książka stwierdza, że do tych informacji należy użyć dekoratora, a nie parametru konstruktora, co prowadzi do:
@ModelSettings("./data/nasdaq.json")
class NasdaqModel extends Model implements IModel {
constructor(metiator : IMediator) {
super(metiator);
}
...
}
Po prostu nie rozumiem, dlaczego powinienem dodawać adres usługi za pośrednictwem dekoratora, a nie tylko jako parametr dla konstruktora, np.
constructor(metiator : IMediator, serviceUrl : string) {...