В статье Рефакторинг без тормозов (десять приемов в одной задаче) было предложено ДЕСЯТЬ! разных вариантов решения одной и той же задачи, возникшие в процессе "улучшения" кода функции. В том числе довольно неоднозначные и даже провокационные по своей форме. Очень хотелось бы знать, какой вариант кажется лучшим? В комментариях можете добавить и свой вариант, если хотите.
Какой из вариантов функции "РазбитьПериод" по вашему лучший
Вариант2 (компактный не универсальный) (25%, 9 голосов)
25%
Вариант8 (универсальный с "Выполнить") (22.22%, 8 голосов)
22.22%
Вариант0 (исходный наивный) (19.44%, 7 голосов)
19.44%
Вариант9 (универсальный с "Выполнить" на английском) (11.11%, 4 голосов)
11.11%
Вариант4 (чужой отрефакторенный) (8.33%, 3 голосов)
8.33%
Вариант6 (компактный с предикатом) (8.33%, 3 голосов)
8.33%
Вариант5 (с предикатом без переменных) (5.56%, 2 голосов)
5.56%
Вариант7 (универсальный с предикатом и "Выполнить") (2.78%, 1 голосов)
2.78%
Вариант3 (качественный чужой) (2.78%, 1 голосов)
2.78%
Вариант1 (формально отрефакторенный) (0%, 0 голосов)
0%
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
В целом статья интересная.
Но хотелось бы, чтобы любая функция была понятна.
Вот, например, я написал такой код год назад, или необходимо разобраться в подобном коде моего коллеги.
Чтобы понять насколько каждый вариант является "читабельным", читал статью снизу вверх.
Первый попавшийся более или менее понятный код: ВАРИАНТ5.
В остальные нужно вчитываться и пытаться понять: Что это?!
Остальные варианты (ниже) конечно хорошие, но по моему палку слегка перегибают.
Варианты после шестого с операцией "Выполнить" универсальны, но их сложно отлаживать и сложно писать.
Но хотелось бы, чтобы любая функция была понятна.
Вот, например, я написал такой код год назад, или необходимо разобраться в подобном коде моего коллеги.
Чтобы понять насколько каждый вариант является "читабельным", читал статью снизу вверх.
Первый попавшийся более или менее понятный код: ВАРИАНТ5.
В остальные нужно вчитываться и пытаться понять: Что это?!
Остальные варианты (ниже) конечно хорошие, но по моему палку слегка перегибают.
Варианты после шестого с операцией "Выполнить" универсальны, но их сложно отлаживать и сложно писать.
В комментариях можете добавить и свой вариант, если хотите.
Добавляю.
На мой взгляд этот код будет:
а) работать чуть быстрее;
б) понятнее для коллег (раз уж мы, в том числе и за читабельность говорим);
в) более приспосболенным для отладки и изменения.
Почему то не работает разукрашка :-(
Выкладываю в чистом виде:
Функция РазбитьПериод(ДатаНачало, ДатаКонец)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РАЗНОСТЬДАТ(&ДатаНачало, &ДатаКонец, МЕСЯЦ) КАК РазностьДат";
Запрос.УстановитьПараметр("ДатаНачало",ДатаНачало);
Запрос.УстановитьПараметр("ДатаКонец",ДатаКонец);
Результат = Запрос.Выполнить().Выбрать().Следующий();
РазностьДат = Запрос.Выполнить().Выгрузить()[0].РазностьДат;
МассивПериодов = Новый Массив;
Интератор = РазностьДат - (РазностьДат * 2);
Пока Интератор <= 0 Цикл
Запрос = Новый Запрос(
"ВЫБРАТЬ
| НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачало, МЕСЯЦ," + Интератор + "), МЕСЯЦ) КАК НачалоПериода,
| КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачало, МЕСЯЦ," + Интератор + "), МЕСЯЦ) КАК КонецПериода");
Запрос.УстановитьПараметр("ДатаНачало",ДатаНачало);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ЗаписьПериода = Новый Структура;
ЗаписьПериода.Вставить("НачалоПериода", Выборка.НачалоПериода);
ЗаписьПериода.Вставить("КонецПериода", Выборка.КонецПериода);
МассивПериодов.Добавить(ЗаписьПериода);
Интератор = Интератор + 1;
КонецЦикла;
Возврат МассивПериодов
КонецФункции
Пытался разукрасить, но получается вот что:
<p style="text-align: left; font-family: courier new,courier; color: blue">
<font color=red>Функция </font>РазбитьПериод<font color=red>(</font>ДатаНачало<font color=red>, </font>ДатаКонец<font color=red>)
</font>Запрос <font color=red>= Новый </font>Запрос<font color=red>;
</font>Запрос<font color=red>.</font>Текст <font color=red>=
</font><font color=black>"ВЫБРАТЬ
| РАЗНОСТЬДАТ(&ДатаНачало, &ДатаКонец, МЕСЯЦ) КАК РазностьДат"</font><font color=red>;
</font>Запрос<font color=red>.</font>УстановитьПараметр<font color=red>(</font><font color=black>"ДатаНачало"</font><font color=red>,</font>ДатаНачало<font color=red>);
</font>Запрос<font color=red>.</font>УстановитьПараметр<font color=red>(</font><font color=black>"ДатаКонец"</font><font color=red>,</font>ДатаКонец<font color=red>);
</font>Результат <font color=red>= </font>Запрос<font color=red>.</font>Выполнить<font color=red>().</font>Выбрать<font color=red>().</font>Следующий<font color=red>();
</font>РазностьДат <font color=red>= </font>Запрос<font color=red>.</font>Выполнить<font color=red>().</font>Выгрузить<font color=red>()[</font><font color=black>0</font><font color=red>].</font>РазностьДат<font color=red>;
</font>МассивПериодов <font color=red>= Новый </font>Массив<font color=red>;
</font>Интератор <font color=red>= </font>РазностьДат <font color=red>- (</font>РазностьДат <font color=red>* </font><font color=black>2</font><font color=red>);
Пока </font>Интератор <font color=red><</font><font color=red>= </font><font color=black>0 </font><font color=red>Цикл
</font>Запрос <font color=red>= Новый </font>Запрос<font color=red>(
</font><font color=black>"ВЫБРАТЬ
| НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачало, МЕСЯЦ," </font><font color=red>+ </font>Интератор <font color=red>+ </font><font color=black>"), МЕСЯЦ) КАК НачалоПериода,
| КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачало, МЕСЯЦ," </font><font color=red>+ </font>Интератор <font color=red>+ </font><font color=black>"), МЕСЯЦ) КАК КонецПериода"</font><font color=red>);
</font>Запрос<font color=red>.</font>УстановитьПараметр<font color=red>(</font><font color=black>"ДатаНачало"</font><font color=red>,</font>ДатаНачало<font color=red>);
</font>Выборка <font color=red>= </font>Запрос<font color=red>.</font>Выполнить<font color=red>().</font>Выбрать<font color=red>();
</font>Выборка<font color=red>.</font>Следующий<font color=red>();
</font>ЗаписьПериода <font color=red>= Новый </font>Структура<font color=red>;
</font>ЗаписьПериода<font color=red>.</font>Вставить<font color=red>(</font><font color=black>"НачалоПериода"</font><font color=red>, </font>Выборка<font color=red>.</font>НачалоПериода<font color=red>);
</font>ЗаписьПериода<font color=red>.</font>Вставить<font color=red>(</font><font color=black>"КонецПериода"</font><font color=red>, </font>Выборка<font color=red>.</font>КонецПериода<font color=red>);
</font>МассивПериодов<font color=red>.</font>Добавить<font color=red>(</font>ЗаписьПериода<font color=red>);
</font>Интератор <font color=red>= </font>Интератор <font color=red>+ </font><font color=black>1</font><font color=red>;
КонецЦикла;
Возврат </font>МассивПериодов
<font color=red>КонецФункции
</font></p>
в чем может быть проблема?
<p style="text-align: left; font-family: courier new,courier; color: blue">
<font color=red>Функция </font>РазбитьПериод<font color=red>(</font>ДатаНачало<font color=red>, </font>ДатаКонец<font color=red>)
</font>Запрос <font color=red>= Новый </font>Запрос<font color=red>;
</font>Запрос<font color=red>.</font>Текст <font color=red>=
</font><font color=black>"ВЫБРАТЬ
| РАЗНОСТЬДАТ(&ДатаНачало, &ДатаКонец, МЕСЯЦ) КАК РазностьДат"</font><font color=red>;
</font>Запрос<font color=red>.</font>УстановитьПараметр<font color=red>(</font><font color=black>"ДатаНачало"</font><font color=red>,</font>ДатаНачало<font color=red>);
</font>Запрос<font color=red>.</font>УстановитьПараметр<font color=red>(</font><font color=black>"ДатаКонец"</font><font color=red>,</font>ДатаКонец<font color=red>);
</font>Результат <font color=red>= </font>Запрос<font color=red>.</font>Выполнить<font color=red>().</font>Выбрать<font color=red>().</font>Следующий<font color=red>();
</font>РазностьДат <font color=red>= </font>Запрос<font color=red>.</font>Выполнить<font color=red>().</font>Выгрузить<font color=red>()[</font><font color=black>0</font><font color=red>].</font>РазностьДат<font color=red>;
</font>МассивПериодов <font color=red>= Новый </font>Массив<font color=red>;
</font>Интератор <font color=red>= </font>РазностьДат <font color=red>- (</font>РазностьДат <font color=red>* </font><font color=black>2</font><font color=red>);
Пока </font>Интератор <font color=red><</font><font color=red>= </font><font color=black>0 </font><font color=red>Цикл
</font>Запрос <font color=red>= Новый </font>Запрос<font color=red>(
</font><font color=black>"ВЫБРАТЬ
| НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачало, МЕСЯЦ," </font><font color=red>+ </font>Интератор <font color=red>+ </font><font color=black>"), МЕСЯЦ) КАК НачалоПериода,
| КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачало, МЕСЯЦ," </font><font color=red>+ </font>Интератор <font color=red>+ </font><font color=black>"), МЕСЯЦ) КАК КонецПериода"</font><font color=red>);
</font>Запрос<font color=red>.</font>УстановитьПараметр<font color=red>(</font><font color=black>"ДатаНачало"</font><font color=red>,</font>ДатаНачало<font color=red>);
</font>Выборка <font color=red>= </font>Запрос<font color=red>.</font>Выполнить<font color=red>().</font>Выбрать<font color=red>();
</font>Выборка<font color=red>.</font>Следующий<font color=red>();
</font>ЗаписьПериода <font color=red>= Новый </font>Структура<font color=red>;
</font>ЗаписьПериода<font color=red>.</font>Вставить<font color=red>(</font><font color=black>"НачалоПериода"</font><font color=red>, </font>Выборка<font color=red>.</font>НачалоПериода<font color=red>);
</font>ЗаписьПериода<font color=red>.</font>Вставить<font color=red>(</font><font color=black>"КонецПериода"</font><font color=red>, </font>Выборка<font color=red>.</font>КонецПериода<font color=red>);
</font>МассивПериодов<font color=red>.</font>Добавить<font color=red>(</font>ЗаписьПериода<font color=red>);
</font>Интератор <font color=red>= </font>Интератор <font color=red>+ </font><font color=black>1</font><font color=red>;
КонецЦикла;
Возврат </font>МассивПериодов
<font color=red>КонецФункции
</font></p>
в чем может быть проблема?
Вот. Вариант №2.
В цикле формируем не запрос для получения каждого по отдельности элемента массива, а текст запроса.
Потом выгружаем запрос в таблицу, а из нее уже формируем массив.
Хотя для реальной задачи формировать массив нет необходимости: можно вернуть сразу таблицу.
Функция РазбитьПериод1(ДатаНачало, ДатаКонец)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РАЗНОСТЬДАТ(&ДатаНачало, &ДатаКонец, МЕСЯЦ) КАК РазностьДат";
Запрос.УстановитьПараметр("ДатаНачало",ДатаНачало);
Запрос.УстановитьПараметр("ДатаКонец",ДатаКонец);
РазностьДат = Запрос.Выполнить().Выгрузить()[0].РазностьДат;
МассивПериодов = Новый Массив;
Интератор = РазностьДат - (РазностьДат * 2);
Запрос = Новый Запрос;
Текст = "";
Пока Интератор <= 0 Цикл
Текст = Текст +
"ВЫБРАТЬ НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачало, МЕСЯЦ," + Интератор + "), МЕСЯЦ) КАК НачалоПериода,
| КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачало, МЕСЯЦ," + Интератор + "), МЕСЯЦ) КАК КонецПериода
| ОБЪЕДИНИТЬ " + Символы.ПС;
Интератор = Интератор + 1;
КонецЦикла;
Текст = Лев(Текст,СтрДлина(Текст) - 14);
Запрос.Текст = Текст;
Запрос.УстановитьПараметр("ДатаНачало",ДатаНачало);
//
Выборка = Запрос.Выполнить().Выгрузить();
Для Каждого Строка Из Выборка Цикл
ЗаписьПериода = Новый Структура;
ЗаписьПериода.Вставить("НачалоПериода", Строка.НачалоПериода);
ЗаписьПериода.Вставить("КонецПериода", Строка.КонецПериода);
МассивПериодов.Добавить(ЗаписьПериода);
КонецЦикла;
Возврат МассивПериодов
КонецФункции
В цикле формируем не запрос для получения каждого по отдельности элемента массива, а текст запроса.
Потом выгружаем запрос в таблицу, а из нее уже формируем массив.
Хотя для реальной задачи формировать массив нет необходимости: можно вернуть сразу таблицу.
Функция РазбитьПериод1(ДатаНачало, ДатаКонец)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РАЗНОСТЬДАТ(&ДатаНачало, &ДатаКонец, МЕСЯЦ) КАК РазностьДат";
Запрос.УстановитьПараметр("ДатаНачало",ДатаНачало);
Запрос.УстановитьПараметр("ДатаКонец",ДатаКонец);
РазностьДат = Запрос.Выполнить().Выгрузить()[0].РазностьДат;
МассивПериодов = Новый Массив;
Интератор = РазностьДат - (РазностьДат * 2);
Запрос = Новый Запрос;
Текст = "";
Пока Интератор <= 0 Цикл
Текст = Текст +
"ВЫБРАТЬ НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачало, МЕСЯЦ," + Интератор + "), МЕСЯЦ) КАК НачалоПериода,
| КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачало, МЕСЯЦ," + Интератор + "), МЕСЯЦ) КАК КонецПериода
| ОБЪЕДИНИТЬ " + Символы.ПС;
Интератор = Интератор + 1;
КонецЦикла;
Текст = Лев(Текст,СтрДлина(Текст) - 14);
Запрос.Текст = Текст;
Запрос.УстановитьПараметр("ДатаНачало",ДатаНачало);
//
Выборка = Запрос.Выполнить().Выгрузить();
Для Каждого Строка Из Выборка Цикл
ЗаписьПериода = Новый Структура;
ЗаписьПериода.Вставить("НачалоПериода", Строка.НачалоПериода);
ЗаписьПериода.Вставить("КонецПериода", Строка.КонецПериода);
МассивПериодов.Добавить(ЗаписьПериода);
КонецЦикла;
Возврат МассивПериодов
КонецФункции
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот