bespoyasov / solidbook

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

Ошибка при попытке воспроизвести код #145

Closed qramilq closed 4 years ago

qramilq commented 4 years ago

Спасибо за книгу всем причастным. Попробовал запустить код из главы про принцип единой ответственности, но он выдает ошибку. Сделал sandbox. Как лучше это можно пофиксить?

bespoyasov commented 4 years ago

Ну, правильнее, конечно, селектор формата заставить возвращать экземпляр не из конструктора, а по вызову какого-нибудь метода. И сейчас мне кажется, что здесь вполне можно обойтись статикой:

class FormatSelector {
  private static formatters = {
    [ReportTypes.Html]: HtmlFormatter,
    [ReportTypes.Txt]: TxtFormatter
  };

  static selectFor(reportType: ReportTypes): Formatter {
    const FormatterFactory = this.formatters[reportType];
    return new FormatterFactory();
  }
}

А использовать его так:

class ReportExporter {
  // ...

  export(reportType: ReportTypes): string {
    const formatter: Formatter = FormatSelector.selectFor(reportType);
    return formatter.format(this.data);
  }
}

Спасибо за внимательность. Я поправлю этот пример, когда доберусь до компьютера.