コード例 #1
0
        /*
         * Что не нравится:
         * Специфичное для каждого из аргументов поведение при выводе данных на печать описано в этом месте,
         *      а не в самих классах. То есть если мы захотим добавить новую функциональность,
         *      нам нужно будет помимо всего прочего (см. 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);
        }