Created
February 9, 2017 18:53
-
-
Save sdrahan/e7cfcf5d5c441c7fe8f23640763d33b4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Вот так было: | |
| class ReportsService { | |
| private ExporterFactory exporterFactory; | |
| private ReportGenerator reportGenerator; | |
| public void makeReportForBank(Bank bank, List rawData) { | |
| String report = reportGenerator.generate(rawData); | |
| Exporter exporter = exporterFactory.createExporterForBank(bank); | |
| exporter.export(report); | |
| } | |
| } | |
| class ReportGenerator { | |
| public String generate(List rawData) { | |
| String result = ""; | |
| for (line in rawData) { | |
| result += formatLine(line.get("foo")); | |
| result += formatLine(line.get("bar")); | |
| } | |
| } | |
| private String formatLine(String line) { | |
| line += "8==Э"; | |
| } | |
| } | |
| // Отчёт генерировался из разных исходных данных, но форма у была него одинаковая для каждого банка. Экспортер брал результат и по-разному отправлял в разные банки. Одному банку нужно заливать на FTP, в другой - отправлять как-то по-другому. Из-за этого у разных банков - разные экспортеры. | |
| // Теперь нужно и форму отчёта иметь разную для разных банков. Допустим, Хаспа хочет, чтобы в каждой строке были foo и bar, а ДойчеБанк хочет только bar. | |
| // Для этого я разделил ReportGenerator по такому же принципу, как и экспортер: | |
| class ReportsService { | |
| private ExporterFactory exporterFactory; | |
| private ReportGeneratorFactory reportGeneratorFactory; | |
| public void makeReportForBank(Bank bank, List rawData) { | |
| ReportGenerator reportGenerator = reportGeneratorFactory.createGeneratorForBank(bank); | |
| String report = reportGenerator.generate(rawData); | |
| Exporter exporter = exporterFactory.createExporterForBank(bank); | |
| exporter.export(report); | |
| } | |
| } | |
| interface ReportGenerator { | |
| String generate(List rawData); | |
| } | |
| class HaspaGenerator { | |
| public String generate(List rawData) { | |
| String result = ""; | |
| for (line in rawData) { | |
| result += formatLine(line.get("foo")); | |
| result += formatLine(line.get("bar")); | |
| } | |
| } | |
| private String formatLine(String line) { | |
| line += "8==Э"; | |
| } | |
| } | |
| class DeutscheBankGenerator { | |
| public String generate(List rawData) { | |
| String result = ""; | |
| for (line in rawData) { | |
| result += formatLine(line.get("bar")); | |
| } | |
| } | |
| private String formatLine(String line) { | |
| line += "8==Э"; | |
| } | |
| } | |
| // А теперь мой вопрос: и там, и там есть formatLine. Он гарантированно будет одинаковым для любого банка, это просто полезная функция из разряда того, что лежит в каких-нибудь StringUtils. | |
| // Куда бы ты этот formatLine положил? |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment