Я читаю книгу "Навчання TypeScript" Ремо Янсена. В одному з розділів автор описує, як створити дуже просту рамку MVC з підтвердженням концепції, включаючи, як створити Model
клас, і говорить наступне:
Модель має бути забезпечена URL-адресою веб-сервісу, який вона споживає. Ми будемо використовувати декоратор класу під назвою ModelSettings для встановлення URL-адреси служби, яка буде споживатися. Ми могли б ввести URL-адресу служби через її конструктор, але вважається поганою практикою введення даних (на відміну від поведінки) через конструктор класів .
Я не розумію цього останнього речення. Зокрема, я не розумію, що означає "вводити дані". Мені здається, що майже у всіх знайомствах з класами JavaScript, використовуючи надто спрощені приклади, в конструктор вводяться («вводяться»?) Через його параметри. Наприклад:
class Person {
constructor(name) {
this.name = name;
}
}
Я, безумовно, вважаю name
це даними, а не поведінкою, і він є загальноприйнятим у цьому прикладі як параметр конструктора, і ніколи не згадується, що це погана практика. Таким чином, я припускаю, що я розумію щось у наведеній цитаті, або те, що розуміється під "даними", або "введенням", або щось інше.
Ваші відповіді можуть містити пояснення, коли, де, як і навіщо використовувати декоратори в JavaScript / TypeScript, оскільки я дуже підозрюю, що ця концепція тісно пов'язана з розумінням, яке я прагну. Однак, що ще важливіше, я хочу зрозуміти більш загально, що розуміється під введенням даних через конструктор класів і чому це погано.
Щоб надати більше контексту вищенаведеній цитаті, така ситуація: створюється Model
клас, який у цьому прикладі буде використовуватися для створення біржових моделей, один для NASDAQ і один для NYSE. Кожна модель вимагає шляху веб-служби або статичного файлу даних, який надаватиме необроблені дані. У книзі зазначено, що для цієї інформації слід використовувати декоратор, а не параметр конструктора, що призводить до наступного:
@ModelSettings("./data/nasdaq.json")
class NasdaqModel extends Model implements IModel {
constructor(metiator : IMediator) {
super(metiator);
}
...
}
Я просто не розумів, чому я повинен додавати службовий URL через декоратор, а не просто як параметр для конструктора, наприклад
constructor(metiator : IMediator, serviceUrl : string) {...