Как избавиться от большого количества комментариев в коде с использованием EDT + Git

15.11.22

Разработка - Рефакторинг и качество кода

Публикация освещает вопрос улучшения качества и читабельности кода путем отказа от излишних комментариев. Рассматривается пример из опыта работы команды разработки на EDT + Git. Команда работает в EDT меньше года. Конфигурация сильно доработана и не обновляется типовыми релизами.

Многие команды разработчиков в процессе выполнения доработок обрамляют код своими (фамильными) комментариями, а также не забывают оставить предыдущую версию кода в виде комментария. Эти комментарии помогают в любой момент времени понять: кто, когда, по какой задаче и какие изменения внес.

// {begin 03.06.2022 Жу... №10208 }
//	    Параметры_С.Вставить("НадписьИнфо", строка_ВыгодаПоКарте);
	    Параметры_С.Вставить("НадписьИнфо", Элементы.ДекорацияИнфо03.Заголовок);
// {end 03.06.2022 Жу... №10208 }

Статья посвящена обратному процессу, то есть, очистке этих комментариев из конфигурации. Интерес к этой статье может появиться у команд, которые перешли, находятся в процессе перехода или планируют переход на EDT + git.

Суть проблемы

Ни для кого не секрет, что в процессе развития бизнеса у программистов появляется все больше и больше задач на доработку. Решение этих задач чаще всего (не всегда) связано с внесением программистами нового кода. Со временем, в результате разработки нового функционала, в системе появляется все больше комментариев. Через несколько лет (или раньше, зависит от размера команды и прыткости каждого ее члена) разработчики начинают терять приличное время на чтение и понимание кода, что отражается на их производительности. Код становится плохо читаем, а скрыть эти комментарии не представляется возможным (в пределах среды разработки).

Польза же от самих комментариев снижается со временем. Есть несколько причин:

Комменты поверх комментов. Разработчики вносят все больше и больше правок, иногда поверх уже кем то доработанного ранее кода. И тут появляется сложность при чтении кода, т.к. надо еще понять, а какой комментарий к чему относится, какой свежее и правильнее. Особенно это касается часто изменяемых участков кода. 

Устаревание комментария. Со временем бизнес логика меняется, и изначальный комментарий становится не актуальным для прикладной задачи. При этом разработчику при выполнении доработки приходится читать длинные поясняющие комментарии или закомментированный другими разработчиками код. 

Качество самих комментариев. Иногда разработчик оставляет неоднозначные комментарии, над которыми, порой, думаешь дольше, чем над самим кодом.  

Большое количество комментариев загромождает код, и сильно отвлекает разработчика от основной задачи - понять, что же этот код делает. Мое самое любимое - это закомментированный запрос в 100500 строк, и следом исправленный вариант запроса. Пока пролистаешь, забудешь о чем шла речь. Еще очень приятно, когда посреди запроса прячутся комменты..

Отрицание

Долгое время наша команда не замечала подобных проблем, пока в один прекрасный день разработчик (привет Геец) не стал жаловаться на сложность понимания кода из за огромного количества комментов. Поинтересовавшись у всей команды, выяснилось, что все испытывают подобную трудность. Терпят и молчат, молчат и терпят. Похоже, нам надо больше общаться..

&НаКлиенте
Процедура ДобавитьВКорзинуФрагмент(ВыбранноеЗначение_ТЗ)
	
	//НовыеСтроки = ПараметрыДанных.НовыеСтроки;
	//ПараметрыТовара = ПараметрыДанных.ПараметрыТовара;
	// Начало изменений БИТ Пят... И.Н.
	//	Если Объект.Товары.Количество() = 0 И (Не СуммаСдачи = 0) Тогда
	//		СуммаСдачи = 0;	
	//	КонецЕсли;	
	// Окончание изменений БИТ Пят... И.Н.
	
	//ВИТТА_ЛАА_2017-12-05 {
	Если ВИТТА_ОптимизированноеПробитие Тогда
		//КопияОбъекта = Объект;
		//ВИТТА_ДобавитьВКорзинуНаСервере(ВыбранноеЗначение_ТЗ, КопияОбъекта, ПараметрыУказанияСерий, ИдентификаторЧековойСмены, ТекущийПродавец);
		//КопироватьДанныеФормы(КопияОбъекта, Объект);
		ВИТТА_ДобавитьВКорзинуНаКлиенте(ВыбранноеЗначение_ТЗ);
		//Если ТекущаяСтрока <> Неопределено Тогда
		//	Элементы.РеквизитТаблица.ТекущаяСтрока = ТекущаяСтрока.ПолучитьИдентификатор();
		//	СтрокаДисплеяПокупателя = Строка(ТекущаяСтрока.Номенклатура);
		//КонецЕсли;	
	Иначе
		ДобавитьВКорзинуНаСервере(ВыбранноеЗначение_ТЗ);//ПараметрыТовара, НовыеСтроки);
	КонецЕсли;
	//ВИТТА_ЛАА_2017-12-05 }	
	
	//	Если Не ИспользоватьНоменклатуруПродаваемуюСовместно Тогда
	//		ПодборТоваровКлиентСервер.УстановитьТекстИнформационнойНадписи(ЭтаФорма);
	//	КонецЕсли;
	
	СкидкиНаценкиКлиент.СброситьФлагСкидкиРассчитаны(ЭтаФорма);
	//ВИТТА_ЛАА_2017-12-05 {
	Если НЕ ВИТТА_ОптимизированноеПробитие Тогда	
		БИТ_ЧекККМКлиент.ПересчитатьДокументНаКлиенте(ЭтаФорма, Объект, Истина);	
		Модифицированность = Истина;
	КонецЕсли;
	//ВИТТА_ЛАА_2017-12-05 }
	
	// Если добавление товара в корзину производилось при заполненной строке поиска,
	// то вернуть фокус ввода на строку поиска.
	//ИмяТекущегоЭлементаСтрокиПоиска = ПодборТоваровКлиент.ИмяТекущегоЭлементаСтрокиПоиска(ЭтаФорма);
	//Если ЗначениеЗаполнено(ЭтаФорма[ИмяТекущегоЭлементаСтрокиПоиска]) Тогда
	//	ПодборТоваровКлиент.УстановитьТекущийЭлементСтрокаПоиска(ЭтаФорма);
	//КонецЕсли;
	
КонецПроцедуры

Согласитесь, подобный код читать нелегко. Нужно в коде из 40 строк найти 10 полезных.

Сделал простой опросник на Google Forms для команды разработчиков. Вот, какие результаты мы получили:

 

 

Приняли решение обсудить этот вопрос на ретроспективе.

Гнев

На ретроспективе мнения разделились. Некоторым разработчикам эти комментарии казались полезными, кто то без них не может жить (привычка). Большинство посчитало, что основная часть комментариев не несет никакой ценности, и может быть просто уничтожено. Но возник вопрос, а как быть с полезными комментариями?  

Нам не удалось принять решение и придти к консенсусу по поводу комментариев. Однако, немного поработав совместно на доске Miro, нам удалось классифицировать комментарии, которыми пользуется команда, накидать предложений (иногда даже безумных) для последующего мозгового штурма, и наметить дальнейший план действий.

Вот что из этого получилось:

 

Решением по итогам ретроспективы стало

1. Проведение мозгового штурма (к следующей ретроспективе договорились, что каждый разработчик оставит свой стикер с комментариями и мыслями под каждой идеей)

2. К следующей ретроспективе изучаем стандарты в части комментариев, смотрим практику других команд. Назначены ответственные.

Торг

К следующей ретроспективе мы подошли более подготовлено. Изучили стандарты, пообщались с другими командами (в том числе не 1с разработчики), разработчики высказались по идеям на доске Miro:

 

На картинке не все видно, но суть отражает.

Команды, разрабатывающие приложения не на 1с, так или иначе используют систему контроля версий, и никогда не пишут комментарии по каждой измененной строке кода. Какие-то команды используют удаленные Git репозитории, кто то разворачивает его в компании локально. Для просмотра изменений используют функционал Git (GitLab, GitHub, Bitbucket), некоторые команды считают удобным использование приложений (SMARTGIT и прочие).

В результате длительного обсуждения, прений и разногласий, команда пришла к выводу, что для просмотра истории изменения кода функционала Git + EDT будет достаточно. Главное вносить корректные коммиты, целиком отражающие суть внесенных изменений.

Решения, принятые на ретро:

1) Сносим все (не несущие пользы) комментарии в части кода, который сейчас дорабатывается и будет тестироваться.

2) Добавляем комменты для кода, который будем менять / удалять в будущем (например, после проверки гипотез).

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

4) Оставляем практику описания процедур и функций. 

Депрессия

После завершения ретроспективы все разошлись по рабочим местам, и приступили к написанию кода "по-новому", соблюдая договоренности, достигнутые на ретро. Однако, некоторым разработчикам было тяжело изменить манеру написания своего кода, старые комментарии казались очень ценными, их уничтожение казалось невосполнимой утратой. Новые комментарии очень сильно напрашивались. Причина тому - не все до конца понимали, как работают механизмы  чтения истории кода в EDT, а разбираться лень и некогда. 

Решение пришло достаточно быстро. При слиянии веток видно, что разработчик добавил лишний комментарий. С такими комментарием пришлось поработать, показать разработчику функционал по просмотру истории кода в EDT, и проконтролировать дальнейшие его доработки на наличие коментов.

Принятие

Постепенно команда начала понимать, что вся история сохраняется, ее просмотр не доставляет неудобств и не занимает много времени. При этом код становится чище, и на его чтение тратится меньше времени.

Для приличия, на примере редактирования части модуля посмотрим функционал EDT для просмотра истории изменения кода:                           

Если ЗначениеЗаполнено(Источник.ВИТТА_Основание) Тогда //по заказу
	СтруктураДжСон.Вставить("order_id",Источник.ВИТТА_Основание.НомерПоДаннымКлиента);          //Номер заказа
	//begin 25.12.2020 ВИТТА Ант... № 835
	//СтруктураДжСон.Вставить("add_txn_id",?(Источник.ВИТТА_Основание.ВИТТА_ИсточникЗаказа = Перечисления.ВИТТА_ИсточникЗаказа.Телефон,Источник.Номер,""));//Идентификатор чека
	//end 25.12.2020 ВИТТА Ант... № 835
	СтруктураДжСон.Вставить("order_total",Источник.ВИТТА_Основание.СуммаДокумента);				//Сумма заказа
Иначе
	СтруктураДжСон.Вставить("order_total",Источник.СуммаДокумента);
	//begin 25.12.2020 ВИТТА Ант... № 835
	СтруктураДжСон.Вставить("add_txn_id", Источник.Номер);//Идентификатор чека
	СтруктураДжСон.Вставить("client_id", СокрЛП(Источник.Склад.Код));
	
//end 25.12.2020 ВИТТА Ант... № 835
КонецЕсли;

Убираем комментарии из кода


Если ЗначениеЗаполнено(Источник.ВИТТА_Основание) Тогда
     СтруктураДжСон.Вставить("order_id",Источник.ВИТТА_Основание.НомерПоДаннымКлиента);          
	 СтруктураДжСон.Вставить("order_total",Источник.ВИТТА_Основание.СуммаДокумента);				
Иначе
	 СтруктураДжСон.Вставить("order_total",Источник.СуммаДокумента);
	 СтруктураДжСон.Вставить("add_txn_id", Источник.Номер);										
	 СтруктураДжСон.Вставить("client_id", СокрЛП(Источник.Склад.Код));
КонецЕсли;

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

Для просмотра истории кода в EDT команда использует несколько возможностей:

 

1 способ. Непосредственно в дереве объектов есть возможность открыть историю изменения объекта:

 

 

Открывается вся история изменений этого объекта. В истории видим, кто, когда и зачем внес изменения:

 

 

С помощью прокрутки увидим сами изменения:

 

 

2 способ. В контексте самого модуля можно сразу видеть какие строки были изменены. Для этого надо щелкнуть правой кнопкой мыши на левом поле редактора и выбрать пункт "Показать информацию о редакции". В этом случае, EDT начнет выделять цветом измененные строки прямо в редакторе:

 

 

На полях появятся подкрашенные номера строк, что свидетельствует о том, что можно посмотреть историю изменений.

 

 

 

При наведении мышкой на подкрашенную строчку, можно перейти к истории.

 

 

Можно открыть информацию, и прокрутить к нужной строке. Снова наводим мышь на подкрашенное поле, EDT покажет, что было изменено.

 

 

Замечу, что все изменения так же можно найти в любой системе контроля версий. Как бы, для этого они и предназначены.

Написание этой статьи спровоцировано отсутствием подобной информации (по крайней мере, мы не нашли за короткое время). Нам бы она помогла в свое время. Надеюсь, она будет полезна тем командам, которые столкнутся с подобной проблемой.

Вот так, по простому о сложном или сложно о простом, кому как зайдет.

Основной вопрос, который у меня возникает: как измерить эффект от этих изменений, дать оценку. Насколько улучшилась читаемость кода, на сколько ускорилась разработка? Пока планирую собирать обратную связь от программистов. А что думает сообщество?

Комментарии EDT git

См. также

DevOps для 1С DevOps и автоматизация разработки Программист Стажер Платные (руб)

Данный онлайн-курс (интенсив) предусматривает изучение процессов, инструментов и методик DevOps, их применение при разработке на платформе 1С. 

2500 руб.

20.06.2023    22265    2    4    

310

SALE! 50%

1С-программирование DevOps и автоматизация разработки Групповая разработка (Git, хранилище) DevOps для 1С Программист Стажер Платформа 1С v8.3 Платные (руб)

Использования систем контроля версий — стандарт современной разработки. На курсе научимся использованию Хранилища 1С и GIT при разработке на 1С:Предприятие 8. Разберем подходы и приемы коллективной разработки, научимся самостоятельно настраивать системы и ориентироваться в них.

4900 2450 руб.

29.06.2022    11932    99    4    

131

DevOps и автоматизация разработки Тестирование QA Программист Пользователь Платформа 1С v8.3 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Автотесты 1С - готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарий – feature-файл, разработанный с помощью vanessa-automation. Запуск сценария выполняется интерактивно с помощью vanessa-automation или с помощью vanessa-runner в CI-системах. Доступно тестирование тонкого клиента. Поддерживаемые версии конфигураций 1С:Зарплата и Управление Персоналом 3 и версии КОРП: 3.1.30.57.

2160 руб.

05.08.2024    1277    12    1    

7

DevOps и автоматизация разработки Логистика, склад и ТМЦ Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Подсистема «Управление сборкой GLI» предназначена для динамического формирования сборочных линий Gitlab и отслеживания процесса доработок систем на базе1С:Предприятия Позволяет упростить выпуск новых релизов системы, подготовить описание доработок системы. Интегрируется с GitLab API по событиям Push, Merge-request, Pipeline. Уведомляет пользователей о результатах сборки/тестирования сборочных конвейеров через СВ, либо при её недоступности или отсутствию по E-Mail. Поможет при отправке исправлений ошибок в общую базу тестирования, сформирует запросы на слияние в ветку версии только по протестированному и подтверждённому функционалу. Подсистема рассчитана исключительно на клиент - серверную архитектуру тестовых ИБ. Поддерживаемая версии СППР 2.0.4.15, платформа не ниже 8.3.17.1549, 2.0.7.3 / не ниже 8.3.21.1664, начиная с релиза 1.0.4.30 требуется платформа не ниже 8.3.23 рекомендуемый релиз 8.3.23.1997

7000 руб.

26.08.2022    12555    10    10    

35

Тестирование QA DevOps и автоматизация разработки Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Налоговый учет Платные (руб)

Готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарии возможно использовать как для vanessa-automation, так и для СППР. Поддерживаемые версии конфигураций ERP2 и КА2: 2.5.17.113.

2400 руб.

04.07.2022    8368    38    1    

29

Тестирование QA DevOps и автоматизация разработки Программист Пользователь Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Налоговый учет Платные (руб)

Автотесты 1С - готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарий – feature-файл, разработанный с помощью vanessa-automation. Запуск сценария выполняется интерактивно с помощью vanessa-automation или с помощью vanessa-runner в CI-системах. Доступно тестирование тонкого клиента. Поддерживаемые версии конфигураций 1С:Бухгалтерия предприятие 3.0 и версии КОРП: 3.0.156.30.

1800 руб.

20.01.2022    7783    19    0    

13

DevOps и автоматизация разработки Программист Платформа 1С v8.3 Бесплатно (free)

В проектной разработке часто возникают проблемы с однообразностью ландшафта, производительностью и быстрой разверткой инфраструктуры. Об одном из способов избежать или изолировать данные проблемы с помощью контейнеризации расскажем в статье.

18.09.2024    1723    antonov_av    6    

14

Рефакторинг и качество кода Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В последнее время термин «чистый код» стал очень популярным. Появились даже курсы по данной тематике. Так что же это такое?

16.09.2024    13981    markbraer    64    

38
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sapervodichka 6912 15.11.22 09:16 Сейчас в теме
Думаю надо еще в сторону обновляемости копать: изменение форм переделывать на динамический вывод элементов, события на перехват подключаемых команд, часть автономных доработок переносить в расширения.
Рамзес; shastin87; +2 Ответить
2. shastin87 9 15.11.22 11:34 Сейчас в теме
(1) Но это, как говорит Леонид Каневский, уже совсем другая история..
3. dhurricane 15.11.22 15:42 Сейчас в теме
Осталось дело за малым - перейти на EDT. :-) Ну что касается темы статьи, то мне видится идеальным подходом на данный момент с одной стороны отсутствие каких-либо служебных комментариев в нетиповых объектах конфигурации и обрамляющие (без сохранения исходного кода) служебные комментарии в типовых модулях.
sapervodichka; t278; +2 Ответить
4. shastin87 9 15.11.22 16:06 Сейчас в теме
(3) Функционал Git можно использовать и без EDT, оставаясь в конфигураторе. Для этого в конфигураторе есть возможность выгружать конфу в файлы, и загружать из файлов. А вот уже система контроля версий поможет сохранить и показать историю изменения кода.
sapervodichka; +1 Ответить
5. dhurricane 15.11.22 16:44 Сейчас в теме
(4) Мы его используем, но это далеко не так удобно, как blame прямо в редакторе модуля.
sapervodichka; +1 Ответить
6. user1615287 07.07.24 16:12 Сейчас в теме
И тебе привет, Илья =)
shastin87; +1 Ответить
Оставьте свое сообщение