Выбор лучшего варианта функции "РазбитьПериод"

1. ildarovich 7861 11.09.13 14:54 Сейчас в теме
В статье Рефакторинг без тормозов (десять приемов в одной задаче) было предложено ДЕСЯТЬ! разных вариантов решения одной и той же задачи, возникшие в процессе "улучшения" кода функции. В том числе довольно неоднозначные и даже провокационные по своей форме. Очень хотелось бы знать, какой вариант кажется лучшим? В комментариях можете добавить и свой вариант, если хотите.
+
Вознаграждение за ответ
Показать полностью

Какой из вариантов функции "РазбитьПериод" по вашему лучший


Вариант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%

Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. DJDUH 17 11.09.13 15:31 Сейчас в теме
(1) ildarovich, интересный "2" и "10" !?!
+
3. It-developer 24 12.09.13 15:34 Сейчас в теме
Только 2. Интересно 7 и 8, но пожалейте своих коллег
+
4. kulikovt 12.09.13 17:41 Сейчас в теме
В целом статья интересная.
Но хотелось бы, чтобы любая функция была понятна.
Вот, например, я написал такой код год назад, или необходимо разобраться в подобном коде моего коллеги.
Чтобы понять насколько каждый вариант является "читабельным", читал статью снизу вверх.
Первый попавшийся более или менее понятный код: ВАРИАНТ5.
В остальные нужно вчитываться и пытаться понять: Что это?!
Остальные варианты (ниже) конечно хорошие, но по моему палку слегка перегибают.
Варианты после шестого с операцией "Выполнить" универсальны, но их сложно отлаживать и сложно писать.
rudak_a; It-developer; +2
5. Pawlick 10 13.09.13 11:34 Сейчас в теме
В комментариях можете добавить и свой вариант, если хотите.


Добавляю.
На мой взгляд этот код будет:
а) работать чуть быстрее;
б) понятнее для коллег (раз уж мы, в том числе и за читабельность говорим);
в) более приспосболенным для отладки и изменения.

Почему то не работает разукрашка :-(
Выкладываю в чистом виде:

Функция РазбитьПериод(ДатаНачало, ДатаКонец)

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РАЗНОСТЬДАТ(&ДатаНачало, &ДатаКонец, МЕСЯЦ) КАК РазностьДат";
Запрос.УстановитьПараметр("ДатаНачало",ДатаНачало);
Запрос.УстановитьПараметр("ДатаКонец",ДатаКонец);
Результат = Запрос.Выполнить().Выбрать().Следующий();
РазностьДат = Запрос.Выполнить().Выгрузить()[0].РазностьДат;

МассивПериодов = Новый Массив;

Интератор = РазностьДат - (РазностьДат * 2);

Пока Интератор <= 0 Цикл

Запрос = Новый Запрос(
"ВЫБРАТЬ
| НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачало, МЕСЯЦ," + Интератор + "), МЕСЯЦ) КАК НачалоПериода,
| КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачало, МЕСЯЦ," + Интератор + "), МЕСЯЦ) КАК КонецПериода");
Запрос.УстановитьПараметр("ДатаНачало",ДатаНачало);

Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();

ЗаписьПериода = Новый Структура;
ЗаписьПериода.Вставить("НачалоПериода", Выборка.НачалоПериода);
ЗаписьПериода.Вставить("КонецПериода", Выборка.КонецПериода);
МассивПериодов.Добавить(ЗаписьПериода);
Интератор = Интератор + 1;

КонецЦикла;

Возврат МассивПериодов

КонецФункции
+
6. Pawlick 10 13.09.13 11:38 Сейчас в теме
Пытался разукрасить, но получается вот что:
<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>

в чем может быть проблема?
+
7. Pawlick 10 13.09.13 12:07 Сейчас в теме
Вот. Вариант №2.
В цикле формируем не запрос для получения каждого по отдельности элемента массива, а текст запроса.
Потом выгружаем запрос в таблицу, а из нее уже формируем массив.
Хотя для реальной задачи формировать массив нет необходимости: можно вернуть сразу таблицу.

Функция РазбитьПериод1(ДатаНачало, ДатаКонец)

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РАЗНОСТЬДАТ(&ДатаНачало, &ДатаКонец, МЕСЯЦ) КАК РазностьДат";
Запрос.УстановитьПараметр("ДатаНачало",ДатаНачало);
Запрос.УстановитьПараметр("ДатаКонец",ДатаКонец);
РазностьДат = Запрос.Выполнить().Выгрузить()[0].РазностьДат;

МассивПериодов = Новый Массив;

Интератор = РазностьДат - (РазностьДат * 2);
Запрос = Новый Запрос;
Текст = "";

Пока Интератор <= 0 Цикл

Текст = Текст +
"ВЫБРАТЬ НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачало, МЕСЯЦ," + Интератор + "), МЕСЯЦ) КАК НачалоПериода,
| КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачало, МЕСЯЦ," + Интератор + "), МЕСЯЦ) КАК КонецПериода
| ОБЪЕДИНИТЬ " + Символы.ПС;


Интератор = Интератор + 1;
КонецЦикла;

Текст = Лев(Текст,СтрДлина(Текст) - 14);
Запрос.Текст = Текст;
Запрос.УстановитьПараметр("ДатаНачало",ДатаНачало);
//
Выборка = Запрос.Выполнить().Выгрузить();

Для Каждого Строка Из Выборка Цикл

ЗаписьПериода = Новый Структура;
ЗаписьПериода.Вставить("НачалоПериода", Строка.НачалоПериода);
ЗаписьПериода.Вставить("КонецПериода", Строка.КонецПериода);
МассивПериодов.Добавить(ЗаписьПериода);

КонецЦикла;

Возврат МассивПериодов

КонецФункции
+
8. Pawlick 10 13.09.13 12:17 Сейчас в теме
На мой взгляд пример удачного рефакторинга прошлого кода это удаление строк:

Текст = "";
Запрос.Текст = Текст;

И замена переменной
Текст

на

Запрос.Текст
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот