/* * Что не нравится: * Специфичное для каждого из аргументов поведение при выводе данных на печать описано в этом месте, * а не в самих классах. То есть если мы захотим добавить новую функциональность, * нам нужно будет помимо всего прочего (см. ReportServiceBase, первый блок с цифрами), еще и здесь * добавлять какие-то данные * * Что хочется: * 0. Создать класс HeaderAndRows с полями * string headerRow; * string rowTemplate; * * В этом месте вместо объявления headerRow и rowTemplate, использовать созданный выше класс * * 1. Создать builder - PrintBuilder, чтобы он осуществлял вывод на консоль необходимых данных * * Почему захотелось использовать паттерн Builder: * 0. Данная реализация очень похожа на применение паттерна Builder (но режет глаза) * 1. Каждое из поведений накладыватся независимо от других * 2. (непрофессионально, но) Хочется все это запихнуть в метод Build :D */ private static void PrintReport(Report report) { var headerAndRows = new HeaderAndRows() { HeaderRow = "Наименование\tОбъём упаковки\tМасса упаковки\tСтоимость\tКоличество", RowTemplate = "{1,12}\t{2,14}\t{3,14}\t{4,9}\t{5,10}" }; var builder = new PrintBuilder() .SetConfig(report.Config) .SetHeaderAndRows(headerAndRows); if (report.Config.Data && report.Data != null && report.Data.Any()) { if (report.Config.Data) { builder.UpdateTemplateByArg(ArgsConst.Data); } foreach (var arg in report.Config.ArgsAddColumns) { builder.UpdateTemplateByArg(arg); } builder.BuildHeadersAndRow(report); Console.ReadLine(); } builder.BuildInTotal(report); }