Вступление
Когда двадцать лет назад я сдал все существующие тогда экзамены уровня 1С:Специалист, то почувствовал себя стесненно: расти некуда. Но потом прочитал чью-то мысль, что после сертификации 1С карьера 1С программиста только начинается. Дышать стало легче. Поэтому я до сих пор начинающий программист. Согласитесь, в условиях нашей динамичной жизни "начинающий программист" звучит лучше, чем "программист с двадцатилетним стажем".
Статья "Совершенный кот" делала упор на наглядность. Сначала хотел просто опубликовать картинки с котом. Поэтому содержательная часть была небольшая. Текущую статью писал к митапу, но чуть-чуть не успел.
Наш основной "манифест" - группа статей "Соглашения при написании кода" очевидно пересекается с классиками (Steve McConnell, Robert C.Martin) И дело не в общих идеях, а в мелочах: максимальная ширина строки, названия переменных, процедур, количество аргументов процедур и прочее. Уверен, что специалисты, которые ее писали, читали классиков гораздо внимательнее, чем мы. Итак, основной признак плохого кода - не использовать преимущества и тренды современного языка 1С. Что бы я еще хотел найти на ИТС ?
1. Большое расстояние между операторными скобками, большое число вложений.
Функция - КонецФункции, Процедура - КонецПроцедуры
По количеству строк функция должна помещаться на экран, чем меньше тем лучше. О том же пишет Robert C.Martin (Clean code) глава 3, Функции, компактность.
Попытка - КонецПопытки. Не каждый код может дать исключение - зачем помещать все в попытку ?
//Некрасиво
Попытка
НовыйДокумент = Документы.ЗаказПокупателя.СоздатьДокумент();
ЗаполнитьЗначенияСвойств(НовыйДокумент, Источник,"Дата,Номер");
НовыйДокумент.Записать();
Исключение
//ЗаписьЖурналаРегистрации(...);
КонецПопытки;
//Красиво
НовыйДокумент = Документы.ЗаказПокупателя.СоздатьДокумент();
ЗаполнитьЗначенияСвойств(НовыйДокумент, Источник,"Дата,Номер");
Попытка
НовыйДокумент.Записать();
Исключение
//ЗаписьЖурналаРегистрации(...);
КонецПопытки;
Пока - КонецЦикла Меньше уровней вложенности.
//Некрасиво
Пока ВыборкаДетальная.Следующий() Цикл
Если ПроверитьУсловие() Тогда
//многабукв
КонецЕсли;
КонецЦикла;
//Красиво
Пока ВыборкаДетальная.Следующий() Цикл
Если НЕ ПроверитьУсловие() Тогда
Продолжить;
КонецЕсли;
//многабукв
КонецЦикла;
Если многабукв - очень большой фрагмент кода, то его можно оформить отдельной процедурой
2. Недостаток абстрактного мышления.
Например, вместо функции ЗаполнитьЗначенияСвойств() используют присваивание.
На картинке обычные формы, но на управляемых я видел похожее решение.
Возможно, одинаковые поля лучше выводить в таблицу, как это сделано в настройках СКД ?
3. Памяти Рэя Бойса и Эдгара Кодда посвящается.
Если данные нужны для одного процента документов, то это точно не реквизит документа. Добавьте его в регистр "ЗначенияСвойствОбъектов", добавьте в табличную часть "ДополнительныеСвойства", сделайте отдельный регистр сведений, отдельную табличную часть, в котором будет значение реквизита и ссылка на документ, только не в сам документ и не в общие реквизиты! Особенность современных баз данных - они гораздо эффективнее, когда растут вниз, а не вправо. В СУБД такие горе-реквизиты выглядят так:
Нравится заполнять диск нулями ?
Вопросы из зала ZOOM (после продолжительных аплодисментов):
Вопрос: - Почему такой логотип ?
Ответ: - Кот на логотипе вымытый, то есть чистый.
Вопрос: - Есть код, которым Вы гордитесь ?
Ответ: - Да, есть такой код (десять строк) - парсинг технологического журнала. Описание проблемы можно найти ИТС, задача поставлена более 10 лет назад, а решить ее удалось только в этом году.
Вопрос: - Почему бы не упомянуть про особенные требования к коду в цикле, коду внутри транзакции ?
Ответ: - Это обычные случаи, как правило все знают.
Вопрос: - Что нужно, чтобы код наших программистов был идеальным ?
Ответ: - Прежде всего, нужно договориться внутри команды, "установить правила игры", одинаковые для всех. Что-то вроде устава, в котором прописать конкретные паттерны и антипаттерны ?
Вопрос: - Что главное для программиста ?
Ответ: - Каждая бочка меда должна содержать хотя бы ложку самоиронии. Может, это то что отличает умного человека от заумного ?
Вопрос: - Ваш любимый мем ?
Ответ: - Наверное, это "Гарольд сдерживает боль" с подписью "Когда увидел большой кусок квазикода..."
и маленькими буквами "...а потом понял, что ты его написал в прошлом году"
Вопрос: - Ваше любимое изречение Конфуция ?
Ответ: -
"Написать красивый код может каждый.
Настоящее искусство программирования
- развивать существующий квазикод,
чтобы он давал квазирезультаты на квазиданных,
и получать за это настоящую зарплату."