Skip to content

Instantly share code, notes, and snippets.

@sdrahan
Created February 9, 2017 18:53
Show Gist options
  • Select an option

  • Save sdrahan/e7cfcf5d5c441c7fe8f23640763d33b4 to your computer and use it in GitHub Desktop.

Select an option

Save sdrahan/e7cfcf5d5c441c7fe8f23640763d33b4 to your computer and use it in GitHub Desktop.
// Вот так было:
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