bespoyasov / solidbook

Book about the SOLID principles and object-oriented software design.
https://solidbook.vercel.app
MIT License
602 stars 59 forks source link

`interface Formatter` - почему данные передаются в конструктор, а не в `format()`? #115

Closed pqr closed 5 years ago

pqr commented 5 years ago

Вопрос к примеру из главы https://ota-solid.now.sh/srp/in-ideal-world/

В примере описан interface Formatter и несколько реалзиаций этого интерфейса, например HtmlFormatter:

interface Formatter {
  data: ReportData;
  format(): string;
}

// класс для форматирования в HTML
class HtmlFormatter implements Formatter {
  data: ReportData

  constructor(data: ReportData) {
    this.data = data
  }

  format(): string {
    // форматируем данные в HTML и возвращаем:
    return 'html string'
  }
}

Мой опыт изучения паттернов в различных источках подсказывает, что если речь идёт не о сущности (Entity), а об утилитарном классе типа Formatter, то "правильнее" было бы передавать данные непосредственно в метод format(), а параметры конструктора использовать лишь для конфигурации (в данном случае конфигурации нет). Исправленный пример:

interface Formatter {
  format(data: ReportData): string;
}

// класс для форматирования в HTML
class HtmlFormatter implements Formatter {
  format(data: ReportData): string {
    // форматируем данные в HTML и возвращаем:
    return 'html string'
  }
}
bespoyasov commented 5 years ago

Спасибо!

Обновили примеры во разделе об SRP и тесты к нему.