Чистый код. Мой взгляд на жизнь в макаронных джунглях. Часть 2

06.10.23

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

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

Картинка для улыбки :)

 

 

Картинка взята с телеграмм-канала Мемы 1С.

Краткое оглавление

  1. Введение
  2. Ссылки
  3. Источники
  4. Глава 2
    1. Содержательные имена
    2. Функции
    3. Комментарии
    4. Форматирование
    5. Многопоточность и длительные операции
  5. Практический результат
  6. Заключение

 

Введение

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

Эта публикация является второй частью. Рекомендую ознакомиться так же с первой частью (хотя они не являются взаимосвязанными).

 

Ссылки

Ссылка на первую часть.

Ссылка на чек-лист.

 

Источники

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

 

Глава 2

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

Далее по статье я буду использовать разные термины: метод, процедура и функция. Примем, что любое из этих слов подразумевает именно метод.

 

Содержательные имена

Имена должны передавать намерения программиста (осмысленные наименования).

Сравните вызов двух функций. В первом случае совершенно очевидно, что функция вернет таблицу значений, содержащую документы «Заказ клиента» и даты их проведения. А во втором случае совсем не очевидно, что делает функция, и что хранится в переменной «ТЗДоки», можно только сказать, что там некая таблица значений.

ТЗЗаказыКлиентов = ПолучитьТЗЗаказыКлиентовСДатамиПроведения();

ТЗДоки = ТЗДоки();

Избегайте дезинформации (наименование не отображает реальное предназначение).

Вызываем функцию «ПолучитьТЗЗаказыКлиентов» и ожидаем, что она вернет нам таблицу значений с документами «Заказ клиента».

ТЗЗаказыКлиентов = ПолучитьТЗЗаказыКлиентов();

Однако если мы посмотрим на определение функции, но увидим, что название не соответствует выполняемому коду.

Функция ПолучитьТЗЗаказыКлиентов()

    Массив = Новый Массив();
    Массив.Добавить(Объект.Ссылка);

    Возврат Массив;

КонецФункции

Функция возвращает массив, однако из названия следует, что она возвращает таблицу значений. Это и есть дезинформация. Если бы мы в последующем стали использовать методы, относящиеся к таблице значений, например ТЗЗаказыКлиентов.Колонки.Добавить(“СвязанныйКлиент”), то получили бы ошибку только в ходе выполнения программы.

Так же можно привести пример с переменными. Когда в переменной ФИОКлиента оказывается наименование юридического лица. Или в переменной ЦенаТовара оказывается сумма (цена*количество).

Осмысленные различия

 Рассмотрим два метода: ПолучитьДанные() и ПолучитьТаблицу(). Разве из наименований этих методов понятно, что они делают? Разве метод ПолучитьДанные не может вернуть таблицу? А таблица не содержит данные? Кажется, что эти методы делают одно и то же. Важно обращать внимание не только на наименование одного метода, но и остальных. Будет ли уместно задавать то или иное наименование метода, когда через 2 метода вниз существует метод с похожим наименованием? В наименованиях методов должны быть четкие различия. Например ПолучитьДанныеВМассив() и ПолучитьДанныеВТабличныйДокумент(). В таком случае различия в методах очевидны: методы возвращают разные типы данных.

Удобопроизносимые имена.

Что скажите о переменной стрВРегДокЗаказКлиент? Или ЭлТЧФорма? Мало того что их произносить неудобно, так ещё и перечитываешь по несколько раз, чтобы понять суть. Совсем другое дело ПредставлениеЗаказаКлиентаВерхнийРегистр (или ПредставлениеЗаказаКлиентаВРег, поскольку ВРег является типовым методом). Не стоит напихивать в наименования сокращения, несвязанные слова и прочее.

Не кодировать имена.

Не стоит кодировать наименования и выдумывать свой собственный язык и правила именования. Плохой пример: кодировать «Число» в «Ч», «Заказ клиента» в «ЗК» и прочее. Используйте только те правила кодирования, которые приняты в вашем направлении, например: «ТаблицаЗначеий» в «ТЗ», «ТабличнаяЧасть» в «ТЧ» и т.д.

Венгерская запись

Типичный пример венгерской записи: «СтрокаНаименование». Венгерская запись – включать в наименования типы данных там, где в этом нет никакого смысла. Всем и так понятно, что наименование – строковый тип данных.

Не использовать префиксы и суффиксы без необходимости.

Иногда встречается стиль написания кода, когда ко всему, что написано в расширениях, добавляются префиксы расширения. И это применяются так же к переменным, что является абсолютно бессмысленным. Суффиксы и префиксы стоит использовать только тогда, когда это необходимо. Плохой пример: «Расш1ТЗЗаказыКлиентов». Изменив наименование на  «ТЗЗаказыКлиентов» наименование станет только более понятней.

Конечно, данный пункт не относится к тем ситуациям, когда платформа автоматически подставляет префиксы (например, при расширении методов).

Пример необходимости применения префикса. В расширении расширяется типовой объект. Добавляется реквизит. Наименование реквизита выбрано такое, что, возможно, в будущих обновлениях типовой конфигурации поставщик может применять его для своих реквизитов. Тогда может случится конфликт при обновлении. В этом случае конечно стоит использовать префикс.

Если наименование присваивается переменной, методу или реквизиту самописного объекта метаданных, скорее всего префикс не будет нужен.

Мысленные преобразования

Читая код, имена мысленно преобразуются в другие, подразумевается что-то другое. Такие наименования лучше избегать. В этом пункте я не смог придумать пример и пока что не встречал его применения на практике в нашей сфере. Если у читателя есть свои предложения – добро пожаловать в комментарии.

Имена методов – глаголы.

Метод с наименованием СуммаТоваров – плохой метод. Непонятно, что происходит с суммой в ходе выполнения метода. Такое наименование больше подходит для переменной. Наименования метода следует начинать с глагола, например РассчитатьСуммуТоваров.

Имена из пространства задачи.

Для наименований следует выбирать имена из предметной области или пространства задачи. Если вы работаете с задачей по изменению заказа клиента, то будет странно, если в вашем коде встретится переменная с именем «СуммаПоБухУчету» или «КоличествоВАптеке» и прочее. Тому, кто читает ваш код, будет непонятно назначение этих переменных и содержащиеся в них данные.

Избыточный контекст

Не нужно для каждого служебного метода добавлять префикс приложения и прочие очевидные вещи, например «УТРассчитатьСуммуТоваров». «УТ» - избыточный контекст, который очевиден и без него.

 

Функции

Компактность.

 
 Цитата из книги

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

Мне очень сложно соблюдать данный пункт. Я сделал для себя послабление – от 1 до 1,5 экрана. Такой объем гораздо легче соблюдать. Если вы соблюдаете 20 строк – вы большой молодец!

Блоки и отступы.

Не более 4 уровней отступов, не содержат вложенных структур. В идеале внутри 1 строка – вызов функции (в новом отступе). Посмотрите на представленный блок кода. С первого раза невозможно разобраться, что здесь происходит. Необходимо перечитать блок 2 и более раз. А после вставки изменений необходимо убедиться, что изменения были вставлены в нужный уровень вложенности, прокрутив весь метод. И это только самые простые условия.

Процедура ОчиститьПоставщиковНоменклатуры()
Для каждого стрТЗЗаказов из ТЗЗаказыКлиентов Цикл
Если стрТЗЗаказов.ВидЗаказа = Перечисления.ВидыЗаказов.Стандартный Тогда
Для каждого стрТовары из стр.ТЗЗаказов.Товары Цикл
Если стр.Товары.ЕдиницаИзмерения = Перечисления.ЕдиницыИзмерения.Штуки Тогда
ТоварОбъект = стр.Товары.ПолучитьОбъект();
Для каждого стрПоставщики из ТоварОбъект.Поставщики Цикл
стрПоставщики.Поставщик = Неопределено;
КонецЦикла;
ТоварОбъект.Записать();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Или его же версия.

Процедура ОчиститьПоставщиковНоменклатуры()

    Для каждого стрТЗЗаказов из ТЗЗаказыКлиентов Цикл
    Если стрТЗЗаказов.ВидЗаказа = Перечисления.ВидыЗаказов.Стандартный Тогда
        Для каждого стрТовары из стр.ТЗЗаказов.Товары Цикл
        Если стр.Товары.ЕдиницаИзмерения = Перечисления.ЕдиницыИзмерения.Штуки Тогда
            ТоварОбъект = стр.Товары.ПолучитьОбъект();
            Для каждого стрПоставщики из ТоварОбъект.Поставщики Цикл
            стрПоставщики.Поставщик = Неопределено;
            КонецЦикла;
                ТоварОбъект.Записать();
        КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецЦикла;

КонецПроцедуры

А теперь взгляните на новый блок. Функционал двух блоков абсолютно одинаковый. Однако после переработки блок кажется проще и понятнее, читается сверху вниз без прокручивания модуля. Изменения вносятся так же легко.

Процедура ОчиститьПоставщиковНоменклатуры()

    Для каждого стрТЗЗаказов из ТЗЗаказыКлиентов Цикл

        Если стрТЗЗаказов.ВидЗаказа = Перечисления.ВидыЗаказов.Стандартный Тогда

            ИзменитьШтучныеТовары(стрТЗЗаказов );

        КонецЕсли;

    КонецЦикла;

КонецФПроцедуры

Процедура ИзменитьШтучныеТовары(ЗаказКлиента)
    
    Для каждого стрТовары из стр.ТЗЗаказов.Товары Цикл

        Если стр.Товары.ЕдиницаИзмерения = Перечисления.ЕдиницыИзмерения.Штуки Тогда

            ОчиститьТЧПоставщикиТовара(стрТовары );

        КонецЕсли;

    КонецЦикла;

КонецПроцедуры

Процедура ОчиститьТЧПоставщикиТовара(Товар)

    ТоварОбъект = Товар.ПолучитьОбъект();

    Для каждого стрПоставщики из ТоварОбъект.Поставщики Цикл

        стрПоставщики.Поставщик = Неопределено;

    КонецЦикла;

    ТоварОбъект.Записать();

КонецПроцедуры

Так же обратите внимание на отступы. Отступы разделяют разные уровни вложенности и позволяют наглядно видеть, на каком уровне находится выполняемый код.

Так же отступы между строками. Они должны отделять логические блоки друг от друга. В первом случае метод выглядит скомканным. Во втором все наглядно. Посмотрите на ещё два блока кода, написанных в одном методе.

Процедура РассчитатьСуммуТоваров()
    СуммаТоваров = 0;
    Для каждого стр из ЗаказКлиента.Товары Цикл
        стр.Сумма = стр.сумма * 1.2;
        СуммаТоваров = СуммаТоваров + стр.Сумма;
    КонецЦикла;
    ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект();
    ЗаказКлиентаОбъект.СуммаДокумента = СуммаТоваров;
    ЗаказКлиентаОбъект.Провести(РежимЗаписиДокумента.Проведение);
КонецПроцедуры
Процедура РассчитатьСуммуТоваров()

    СуммаТоваров = 0;

    Для каждого стр из ЗаказКлиента.Товары Цикл

        стр.Сумма = стр.сумма * 1.2;

        СуммаТоваров = СуммаТоваров + стр.Сумма;

    КонецЦикла;

    ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект();
    ЗаказКлиентаОбъект.СуммаДокумента = СуммаТоваров;
    ЗаказКлиентаОбъект.Провести(РежимЗаписиДокумента.Проведение);

КонецПроцедуры

Во втором блоке выделены логические области: переменные, изменение строки заказа, заполнение переменных, изменение заказа. Эти области обрамлены отступами, что отделяет их от основного кода.

Функция выполняет только одну операцию на одном уровне.

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

Процедура РассчитатьСуммуТоваров()

    СуммаТоваров = 0;

    Для каждого стр из ЗаказКлиента.Товары Цикл

        стр.Сумма = стр.сумма * 1.2;

        СуммаТоваров = СуммаТоваров + стр.Сумма;

    КонецЦикла;

    ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект();
    ЗаказКлиентаОбъект.СуммаДокумента = СуммаТоваров;
    ЗаказКлиентаОбъект.Провести(РежимЗаписиДокумента.Проведение);

КонецПроцедуры

Из операций можно выделить следующие: изменение строки заказа, добавление данных в массив, изменение переменной, изменение документа. Так же здесь 3 уровня: переменные, строки заказа, документ заказа. Таким образом нужно выделить 2 метода.

Процедура РассчитатьСуммуТоваров()

    СуммаТоваров = 0;

    Для каждого стр из ЗаказКлиента.Товары Цикл
        
        ИзменитьСтрокуЗаказа(стр);

        СуммаТоваров = СуммаТоваров + стр.Сумма;

    КонецЦикла;

    ИзменитьСуммуЗаказа(ЗаказКлиента, СуммаТоваров );
    
КонецПроцедуры

Процедура ИзменитьСтрокуЗаказа(стрЗаказа)

    стрЗаказа.Сумма = стрЗаказа.сумма * 1.2;

КонецПроцедуры

Процедура ИзменитьСуммуЗаказа(ЗаказКлиента, СуммаТоваров)

    ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект();
    ЗаказКлиентаОбъект.СуммаДокумента = СуммаТоваров;
    ЗаказКлиентаОбъект.Провести(РежимЗаписиДокумента.Проведение);

КонецПроцедуры

Это наиболее простой пример, встречаются примеры, когда выделяются целые циклы или несколько циклов.

Чтение кода сверху вниз: правило понижения.

В одной функции вызываются функции одного уровня абстракции. В предыдущем примере было четко видно 3 уровня абстракции: переменные, строки заказа, документ заказа. После выделения в отдельные методы, в одной функции остался только один уровень абстракции. Таким образом при чтении метода если мы будет проваливаться в один из методов мы будем углубляться в подробности, переходить на более низкий уровень абстракции, но в пределах одного метода мы будет на одном уровне абстракции.

Содержательные имена.

Требования к именованию методов такие же, как и к переменным: имена должны отражать то, что делает метод, нести логический смысл, не быть перегруженными и т.д.

Аргументы функций.

Максимум 2-4 аргумента. Однако есть хитрость: если у функции несколько аргументов их можно объединить в структуру, и передавать структуру как один аргумент.

Возврат должен явно отображаться. Помните, что все ветви выполнения кода в функции должны содержать возврат. Так же функция должна всегда возвращать значение. Не следует использовать функции без возврата.

Возврат через аргументы не следует использовать. Для возврата значений используйте функции и возвращаемые параметры (ключевое слово Возврат). Возврат через аргументы делает код запутанным.

Передача флага в аргумент.

Зачастую, если в функцию требуется передать флаг – это значит, что функция выполняет более одной операции и её требуется разбить на несколько методов.

Передача множества аргументов

Если в аргументах передается много параметров одного объекта (или структура, содержащая много параметров одного объекта), проще передать весь объект.

Много аргументов можно обернуть в массив или структуру и передавать как один аргумент. В этом случае нужно создать описание метода и описать структуру параметра, какие поля он содержит.

Побочные эффекты.

 
 Цитата из книги

 Метод делает дополнительные операции, не заявленные в имени. Для примера возьмем безвредную на первый взгляд функцию. Функция использует стандартный алгоритм для проверки пары «имя пользователя/пароль». Она возвращает Истина в случае совпадения или Ложь при возникновении проблем. Но у функции также имеется побочный эффект. Имя ПроверитьПароль сообщает, что функция проверяет пароль. Оно ничего не говорит о том, что функция инициализирует сеанс. Таким образом, тот, кто поверит имени функции, рискует потерять текущие сеансовые данные, когда он решит проверить данные пользователя.

Проверка и действие – разные методы. Пример:

Если ИзменитьРеквизит("Имя", "Иван") Тогда

В данном случае непонятно, что делает функция ИзменитьРеквизит и почему она используется в условии. Для данного случая следует создать 2 функции: первая, которая изменяет реквизит, и вторая, которая проверяет, что реквизиту задано соответствующее значение.

Если Не ПроверитьРеквизит("Имя", "Иван") Тогда
    ИзменитьРеквизит("Имя", "Иван");
КонецЕсли;

Попытка и исключение

Код внутри попытки и внутри исключения лучше выносить в отдельные методы.

 

Комментарии

О комментариях

 
 Цитата из книги

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

Грамотное применение комментариев должно компенсировать нашу неудачу в выражении своих мыслей в коде. Обратите внимание на слово «неудачу». Комментарий — всегда признак неудачи. Мы вынуждены использовать комментарии, потому что нам не всегда удается выразить свои мысли без них.

Комментарии лгут. Не всегда и не преднамеренно, но это происходит слишком часто. Чем древнее комментарий, чем дальше он расположен от описываемого им кода, тем больше вероятность того, что он просто неверен. Причина проста: программисты не могут нормально сопровождать комментарии.

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

Одной из распространенных причин для написания комментариев является низкое качество кода. Вы пишете модуль и видите, что код получился запутанным и беспорядочным. Вы знаете, что разобраться в нем невозможно. Поэтому вы говорите себе: «О, да это стоит прокомментировать!» Нет! Лучше исправьте свой код! Ясный и выразительный код с минимумом комментариев гораздо лучше громоздкого, сложного кода с большим количеством комментариев. Не тратьте время на написание комментариев, объясняющих созданную вами путаницу, — лучше потратьте его на исправление.

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

TODO комментарий

Можно оставлять TODO комментарии. Они обозначают намерения реализовать данный метод позже. Возможно сейчас его нельзя реализовать в полной мере.

Процедура ИзменитьСуммуТовара(стрЗаказа)

    //TODO: сделать изменение суммы товара
    //Сейчас модуль расчета суммы не реализован

КонецПроцедуры

По «TODO» очень легко искать места, которые ещё не реализованы. Достаточно воспользоваться поиском.

Непонятные комментарии

Если при прочтении комментария стороннему человеку не понятно, что он значит – это плохой комментарий

Процедура ИзменитьСуммуЗаказа(ЗаказКлиента, СуммаТоваров)

    // заказ

    ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект();
    ЗаказКлиентаОбъект.СуммаДокумента = СуммаТоваров;
    ЗаказКлиентаОбъект.Провести(РежимЗаписиДокумента.Проведение);

КонецПроцедуры

Избыточные комментарии

Если код понятен без комментария, комментарий не поясняет и не дополняет код – это плохой комментарий.

Процедура ИзменитьСуммуЗаказа(ЗаказКлиента, СуммаТоваров)

    // измененный заказ проводится

    ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект();
    ЗаказКлиентаОбъект.СуммаДокумента = СуммаТоваров;
    ЗаказКлиентаОбъект.Провести(РежимЗаписиДокумента.Проведение);

КонецПроцедуры

Противоречащие комментарии

Если комментарий противоречит коду – это плохой комментарий.

Процедура ИзменитьСуммуЗаказа(ЗаказКлиента, СуммаТоваров)

    // заказ записывается без проведения

    ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект();
    ЗаказКлиентаОбъект.СуммаДокумента = СуммаТоваров;
    ЗаказКлиентаОбъект.Провести(РежимЗаписиДокумента.Проведение);

КонецПроцедуры

Чаще всего причина таких комментариев – изменение кода без изменения комментариев.

Обязательные комментарии

Обязательные комментарии – зло (описание методов и аргументов – обязательные комментарии по стандартам). Их стоит использовать только тогда, когда это действительно необходимо. Не стоит к каждому методу приписывать описание.

Комментарии для сложных блоков кода

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

Закомментированный код

Закомментированный код – плохой комментарий. Другие разработчики не решатся его удалить, а о его важности будет знать только создатель. Такой код может жить в модуле несколько лет.

Связь комментария с кодом

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

Комментарии для методов

Хорошо выбранное имя метода лучше, чем имя метода и комментарий.

 

Форматирование

Детализация

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

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

Процедура РассчитатьСуммуТоваров()

    СуммаТоваров = 0;

    Для каждого стр из ЗаказКлиента.Товары Цикл
        
        ИзменитьСтрокуЗаказа(стр);

        СуммаТоваров = СуммаТоваров + стр.Сумма;

    КонецЦикла;

    ИзменитьСуммуЗаказа(ЗаказКлиента, СуммаТоваров );
    
КонецПроцедуры

Процедура ИзменитьСтрокуЗаказа(стрЗаказа)

    стрЗаказа.Сумма = стрЗаказа.сумма * 1.2;

КонецПроцедуры

Процедура ИзменитьСуммуЗаказа(ЗаказКлиента, СуммаТоваров)

    ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект();
    ЗаказКлиентаОбъект.СуммаДокумента = СуммаТоваров;
    ЗаказКлиентаОбъект.Провести(РежимЗаписиДокумента.Проведение);

КонецПроцедуры

Отступы между строками

Каждая группа строк представляет законченную мысль. Такие группы следует разделять пустыми строками.

Процедура РассчитатьСуммуТоваров()

    СуммаТоваров = 0;

    Для каждого стр из ЗаказКлиента.Товары Цикл

        стр.Сумма = стр.сумма * 1.2;

        СуммаТоваров = СуммаТоваров + стр.Сумма;

    КонецЦикла;

    ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект();
    ЗаказКлиентаОбъект.СуммаДокумента = СуммаТоваров;
    ЗаказКлиентаОбъект.Провести(РежимЗаписиДокумента.Проведение);

КонецПроцедуры

Выделены логические области: переменные, изменение строки заказа, заполнение переменных, изменение заказа. Эти области обрамлены отступами, что отделяет их от основного кода.

Строки кода, между которыми существует тесная связь, должны быть вертикально сжаты, между ними нет пустых строк, комментариев и других разрывов.

Объявление переменных

Переменные объявляются непосредственно перед их использованием. Не следует объявлять переменные в начале модуля. Дойдя до места их использования, читатель забудет об их существовании.

Расположение вызываемых методов между собой

Вызываемый метод должен находится радом с вызывающим, а вызывающий метод должна быть сверху (если это возможно).

Длинна строк

Строки должны быть шириной не более 120 символов.

Разделение и сжатие

Следует использовать горизонтальное сжатие и разделение. Операторы присваивания выделять с двух сторон пробелами, разделять пробелами аргументы методов, после запятой ставить пробел. А вот метод и скобку наоборот следует сжимать, не разделяя.

Отступы

Исходный файл имеет иерархическую структуру. В нем присутствует информация, относящаяся к методам внутри модулей; к блокам внутри методов и рекурсивно – к блокам внутри блоков. Каждый уровень этой иерархии образует область видимости, в которой могут объявляться имена и в которой интерпретируются исполняемые команды. Чтобы создать наглядное представление этой иерархии, мы снабжаем строки исходного кода отступами, размер которых соответствует их позиции в иерархии. Команды уровня методов отступов не имеют. Реализации этих методов сдвигаются на один уровень вправо от объявления метода. Реализации блоков сдвигаются на один уровень вправо от своих внешних блоков и т. д. Программисты широко используют эту схему расстановки отступов в своей работе. Чтобы определить, к какой области видимости принадлежат строки кода, они визуально группируют строки по левому краю. Это позволяет им быстро пропускать области видимости, не относящиеся к текущей ситуации (например, реализации команд Если и Цикл). У левого края ищутся объявления новых методов, новые переменные. Без отступов программа становится практически нечитаемой для людей.

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

 

Многопоточность и длительные операции

Многопоточность и длительные операции полезны только при большом объеме данных. На их реализацию необходимо дополнительное время. Не следует реализовывать многопоточность и длительные операции без должного изучения.

 

Практический результат

  1. Разработка конфигурации для внутренних нужд нашей компании. На разработку был выделен молодой и перспективный разработчик без опыта работы. В то время ещё не было в нашей команде понятия о стандартах и чистом коде. Разработка планировалась на 2 месяца с учетом неопытного сотрудника. Проект был начат в далеком январе 2022 года… И продолжается до сих пор. Код этого проекта – «легаси» (кому интересно поищите в интернете определение). Сам же разработчик закончил работу только через 6 месяцев. Никто, даже он, уже не могли разобраться в написанном. Этот тот проект, о котором можно сказать: «проще все с нуля сделать, чем переделывать». Кто-то может сказать: причина в неопытности. Я же скажу следующее: если бы разработчик руководствовался не своими фантазиями, а конкретными правилами, то вышел бы качественный продукт. В данном случае на этапе разработки сроки превышены в 3 раза, а сопровождаемость снижена до нуля.
  2. Разработка модуля интеграции с облачной кассой для торговых конфигураций. В этом проекте было 2 модуля: интеграция с УТ (первый этап) и интеграция с ещё двумя конфигурациями (УНФ, Розница 2.3) (второй этап). Первый этап был оценен в 2 месяца с учетом тестов клиента. При разработке старались придерживаться стандартов и правил чистого кода. Разработкой занимался я лично. Проект был закончен в срок. Когда начали выполнять второй этап, за основу взяли код из первого этапа. На проект было заложено 2 месяца (при объеме работ на 20% больше, чем в первом этапе). Разработкой занимались два других менее опытных разработчика по отдельности (каждый на своей конфигурации). На мое удивление, вопросов было очень мало, а разработчики самостоятельно во всем разобрались. Второй этап был закончен за 1 месяц. В данном случае мы получили опережение по срокам в 2 раза.
  3. Расширение стороннего разработчика для УТ. После обновления конфигурации мы уже 3 месяца получаем ошибки в совершенно разных местах (при том, что большинство ошибок были исправлены сразу после обновления). Часто ошибки одни и те же, но возникают в разных местах (дублирование кода). На такие ошибки, по первоначальной оценке, мы должны были тратить не более 1 часа. Однако после некоторого количества таких ошибок стало понятно, что время исправления занимает около 3-4 часов. Проблема кроется в запутанности кода.

 

Заключение

В этой главе я показал правила из главы 2 книги. Они представляют собой конкретные действия, которые я и моя команда соблюдаем. Так же я привел практические примеры, которые для меня показывают эффективность описанных правил. Сейчас мы в команде стараемся руководствоваться этими (и не только) правилами при работе.

Приглашаю обсудить все в комментариях, много спорных вопросов. Надеюсь, вы выскажете свое драгоценное мнение, чтобы улучшить этот мир!

чистый код рефакторинг Роберт Мартин качество кода статья стандарты написания кода

См. также

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

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

16.09.2024    13970    markbraer    64    

38

Рефакторинг и качество кода Программист Бесплатно (free)

В статье рассматривается отказ от использования процедур и унификация формата ответа функций. Способ описывается на примере развития абстрактной информационной системы, работающей с PDF файлами.

10.09.2024    917    acces969    4    

6

Рефакторинг и качество кода Бесплатно (free)

Для быстродействия большой базы данных важно не только оптимизировать запросы, но и соблюдать стандарты при разработке подписок на события, обработок для массового изменения данных, в реализации обработчиков обновления, расширений, регламентных заданий и в архитектуре СКД-отчетов. Расскажем о нюансах разработки компонентов большой системы.

28.08.2024    1163    Chernazem    3    

6

Рефакторинг и качество кода Программист Бесплатно (free)

SOLID – принципы проектирования программных структур (модулей). Акроним S.O.L.I.D. образован из первой буквы пяти принципов. Эти принципы делают код более гибким, упрощают разработку. Принято считать, что принципы SOLID применимы только в объектно-ориентированном программировании. Но их можно успешно использовать и в 1С. Расскажем о том, как разобраться в принципах SOLID и начать применять их при работе в 1С.

22.08.2024    10204    alex_sayan    41    

52

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

Рассмотрим основные принципы шаблона проектирования "Стратегия" на простом примере.

25.06.2024    4199    MadRave    34    

27

Рефакторинг и качество кода Программист Платформа 1С v8.3 Абонемент ($m)

В статье расскажу и покажу процесс проведения Code-review на примере обработки с GitHub.

1 стартмани

04.06.2024    6275    mrXoxot    55    

42

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

Поделюсь своим опытом аудита кода авторских продуктов с Infostart.ru как одним из элементов применения DevOps-практик внутри Инфостарт. Будет настоящий код, боевые скриншоты, внутренние мемы от команды ИТ-лаборатории Инфостарт и прочее мясо – все, что любят разработчики.

10.04.2024    13356    artbear    85    

108

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

Предлагаю вашему вниманию советы мастеров древности. Программисты прошлого использовали их, чтобы заострить разум тех, кто после них будет поддерживать код. Гуру разработки при найме старательно ищут их применение в тестовых заданиях. Новички иногда используют их ещё лучше, чем матёрые ниндзя. Прочитайте их и решите, кто вы: ниндзя, новичок или, может быть, гуру? (Адаптация статьи "Ниндзя-код" из учебника JavaScript)

01.04.2024    4236    DrAku1a    15    

39
Отзывы
126. Serg O. 19.10.23 09:34 Сейчас в теме
Хорошая статья, но...
хотелось бы "автоматизации" проверки на стандарты...
и о чудо, она есть... (но не совсем из коробки)

Лучше, когда код можно проверить сразу ... прямо не выходя из конфигуратора!

1) Феникс BSL (спасибо автору Отымко)
ставится в Windows просто 1 файлом - легко и понятно - запустить - далее-далее - готово!
пользоваться - прямо из кода модуля - Ctrl +Shift + i см. фото ниже - список ...
кликабельный - сразу перепрыгивает на строку ошибки.
сам уже года 2 наверное использую... необходимость ставить "лишние" пробелы между операторами = > < + - * /
меня лично бесят, но это не ошибка, я это игнорирую.

2) Для всей конфы - (после выгрузки в файлы) - удобнее использовать Visual Studio Code (бесплатный!), ну или кто любит - SonarQube (платный), который ещё настраивать на отдельном сервере надо...
это для "продвинутых" только... для "начинающих" я читаю он не подъёмный, уж извините.

Visual Studio Code пользоваться можно для проверки в целом уже написанного (см. скрин VSC)
(и да, там есть тёмная тема для 1С, что очень не плохо для проверки кода по ночам)
- открыть папку с файлами выгрузки из конфы ...
(установить 1 раз! "расширение для VSC": 1C (BSL) Extention Pack ) и вуа-ля... чудо проверки уже в кармане.

Насчет примеров я бы поспорил немного, ну да ладно,

разделять 1 маленькую функцию на "абстракции" по 1 строке... это только запутывает,
я бы тут добавил ещё пару "метрик" - число процедур и функций в модуле... мин - макс и среднее число строк в них
наверное это "легко" добавить, но почему-то никто это не сделал (или я не вижу где это посмотреть)
и "целесообразность" увеличения числа процедур и функций.

Оба этих инструмента работают на "одном движке" - BSL Language Server, который постоянно обновляют и дорабатывают различные проверки по стандартам 1С.

Потому что чек-лист конечно хорошо, но ... тут могут появиться разные понимания... что лучше что хуже
и упрётся всё в то, что это "вкусовщина" или "делай как я сказал" , "я начальник - ты дурак"...

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

VSC ещё показывает и "когнитивную сложность" методов и функций - это как раз и есть "запутанность" кода
она так же меряется в цифрах... норма 5-10 , но для 1С бывает процедуры и до 50 -100 легко, тут так же не нужно очень сильно дробить 1 мега-функцию на кучу по 1-5 строк, но задуматься стоит.

P.S.
а) Оформление кода "лесенкой" делается в 2 нажатия ...
1) выделить часть кода или весь текст Ctrl + A
2) Alt +Shift + F (или через главное меню Текст - Блок - Форматировать)

б) Двойные пустые строки - считаются "дефектом кода" и в VSC и в Фениксе - они отображаются как Информация или Предупреждение - из VSC - можно сразу (по гипер-ссылке) открыть подробное описание "Данного Дефекта кода"

Лишние строки... я считаю излишком, да, только блоки разделять надо, а не после каждой строки - пустую
это только растягивает текст не на 1 а на 2-3 экрана и читать невозможно становится.
Прикрепленные файлы:
VAAngelov; Egovigor; vlastek; mikl79; teplova_ok; Lemmonbri; +6 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ImHunter 327 27.09.23 12:20 Сейчас в теме
Ошибочки в примерах кода...
Перепечатывание Макконнелла и Мартина - ну такое себе занятие, достаточно бессмысленное. Кому нужно - сам прочитает, кому не нужно - так и будет нарушать правила, даже зная о них. Лучше уж СонарКуб настроить.
Serg O.; Дмитрий74Чел; cheshirshik; tindir; _LkMaksimka_; rpgshnik; Lemmonbri; +7 Ответить
2. Lemmonbri 142 27.09.23 12:48 Сейчас в теме
(1) "Ошибочки в примерах кода" - можете указать на ошибки? Поправлю.
Это не перепечатывание, как я считаю. Я привел много своих мыслей, интерпретаций, пояснений и примеров. Начинающий 1Сник, прочитав Мартина, ничего не выявит для себя. Да и не факт, что сможет разобраться в java коде.
"Кому нужно - сам прочитает" - так можно о чем угодно сказать.
Касаемо сонаркуба - там есть тонкости и нюансы. Наименования он не откорректирует. В частности сонаркуб не заменит хорошего рефакторинга от эксперта. Я бы сказал, что они дополняют друг друга.
18. rwf96 28.09.23 05:47 Сейчас в теме
(1) Я тоже считаю что это не перечитывание. Примеры из книги очень хорошо иллюстрируются в 1с. Только люди с опытом советы Мартина могут сразу применить к коду на 1с, а вот начинающим как раз подойдут такие статьи с примерами.
60. alex_sayan 51 30.09.23 09:44 Сейчас в теме
(1) сонаркуб не панацея, он только на мелкие распространённые огрехи указывает. Код может удовлетворять сонаркубу, но при этом оставаться невнятным, эдаким мычанием-шипением. Понятным код может сделать только человек
Serg O.; brr; +2 Ответить
3. ImHunter 327 27.09.23 12:55 Сейчас в теме
(2) Ошибочки, может не все:

ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект();
    ЗаказКлиента.СуммаДокумента = СуммаТоваров;



            Товар.Объект = стр.Товары.ПолучитьОбъект();
            Для каждого стр.Поставщики из ТоварОбъект.Поставщики Цикл
            стр.Поставщики = Неопределено;
            КонецЦикла;
                ТоварОбъект.Записать();
Lemmonbri; +1 Ответить
5. Lemmonbri 142 27.09.23 13:02 Сейчас в теме
4. tirkirill 27.09.23 12:57 Сейчас в теме
ПолучитьТЗЗаказыКлиентовСДатамиПроведения()


Не кажется, что это плохой пример? Тип лучше наверное вынести в докстринг, а не оставить в названии, тем более, что например edt подсказывает, если докстринг правильно оформлен. Функции, насколько могу судить, не стоит называть с "Получить..." лучше тогда ЗаказыКлиентовСДатамиПроведения(), не?
pavlov_dv; NicholasUzunov; Rokov; maximus_2712; user649290_jenia1592; brr; Lemmonbri; +7 Ответить
6. Lemmonbri 142 27.09.23 13:07 Сейчас в теме
(4) В случае с типом согласен. И конфигуратор тоже подсказывает, и edt.
На счет названия функций, стандарты и Мартин рекомендуют с глагола называть методы. https://its.1c.ru/db/v8std/content/647/hdoc
72. Rokov 02.10.23 10:42 Сейчас в теме
(6)
Глаголы нужны только в том случае, когда
важно, каким образом было получено возвращаемое значение.

Иначе - наоборот не советует
В приведенном примере - он не по стандарту
74. Lemmonbri 142 02.10.23 10:58 Сейчас в теме
(72) Вы читаете между строк стандарт. Давайте разберем детально.
"Имена процедур в общем случае, следует образовывать от неопределенной формы глагола, от сути выполняемого действия" - из стандартов. Делаем вывод, что имена процедур в общем случае всегда от глагола.
"В имени функции рекомендуется использовать глаголы в неопределенной форме в тех случаях, когда для понимания назначения функции важно, каким образом было получено возвращаемое значение." - функция, делаем вывод, что если в функции главное возвращаемое значение - то от глагола.
"Если выполнение функции предполагает, прежде всего, какое-либо действие, и при этом возврат значения не является ее основной задачей (например, это признак успешно выполненного действия), то имена таких функций следует образовывать от неопределенной формы глагола, как и для процедур." - функция, тоже от глагола.
В итоге стандарты всегда рекомендуют от глагола начинать, меняется только его форма: определенная или неопределенная.
AND_reyZ; +1 Ответить
101. Rokov 03.10.23 08:40 Сейчас в теме
(74)
жду строк стандарт. Давайте разберем детально.
"Имена процедур в общем случае, следует образовывать от неопределенной формы глагола, от сути выполняемого действия" - из стандартов. Делаем вывод, что имена процедур в общем случае всегда от глагола.
"В имени функции рекомендуется использовать глаголы в неопределенной форме в тех случаях, когда для понимания назначения функции важно, каким образом было получено возвращаемое значение." - функция, делаем вывод, что если в функции главное возвращаемое значение - то от глагола.
"Если выполнение функции предполагает, прежде всего, какое-либо действие, и при этом возврат значения не является ее основной задачей (например, это признак успешно выполненного действия), то имена таких функций следует образовывать от неопределенной формы глагола, как и для процедур." - функция, тоже от глагола.
В итоге стандарты всегда рекомендуют от глагола начинать, меняется только его форма: определенная или неопределенная.


Функция ПолучитьТЗЗаказыКлиентов() по стандарту будет правильней называться
ЗаказыКлиентов()
Смотрите примеры в пункте 4
Незначимые глаголы (типа вернуть , получить, создать) - не нужно использовать

П. 6.1. Имена функций в общем случае следует образовывать от описания возвращаемого значения.

И только в том случае, если важно, как это значение получено, тогда использовать глаголы рекомендуется, но это далеко не общий случай
7. Lemmonbri 142 27.09.23 13:08 Сейчас в теме
(4) Вообще я только сейчас понял что не раскрыл тему докстринг совсем, надо будет дописать.
8. ImHunter 327 27.09.23 13:20 Сейчас в теме
(5)
Процедура ОчиститьТЧПоставщикиТовара(Товар)

    ТоварОбъект = стр.Товары.ПолучитьОбъект();
Lemmonbri; +1 Ответить
9. Lemmonbri 142 27.09.23 13:23 Сейчас в теме
10. ImHunter 327 27.09.23 13:32 Сейчас в теме
(9) Законченность мысли в Процедура ОчиститьПоставщиковНоменклатуры() пока не достигнута.
Вот непонятно, зачем там МассивТоваров.

Все, больше не буду занудствовать;)
Lemmonbri; +1 Ответить
11. Lemmonbri 142 27.09.23 13:34 Сейчас в теме
(10) А это чтоб понимать, кто внимательно читает, а кто нет)
12. Lemmonbri 142 27.09.23 13:37 Сейчас в теме
(10) Поубирал, видимо осталось от прошлой версии документа с другими примерами. На самом деле я даже рад, когда такие люди, как Вы, пишут замечания.
13. Teplotrassamen 27.09.23 14:28 Сейчас в теме
Плохой пример: «Расш1ТЗЗаказыКлиентов». Изменив наименование на «ТЗЗаказыКлиентов» наименование станет только более понятней

Не понял почему это плохо. Ведь если в расширяемый объект конфигурации добавили свой реквизит "ТЗЗаказы", то тут вероятность того что когда-нибудь появится такой же реквизит от поставщика выше, чем реквизит наименования "Расш1_ТЗЗаказы".
Или имелось ввиду что в своей объект расширения, например Расш1_Документ, добавляют реквизиты с префиксом "Расш_"?
Lemmonbri; +1 Ответить
61. alex_sayan 51 30.09.23 09:55 Сейчас в теме
(13) за префиксы в именах объектов и методов я бы руки поотрывал

Процедура Пупкин_СделатьЧтоТо()

Я читаю код ради ответов на два ключевых вопроса:
- что код делает?
- как код делает?
в в 99,999% случаев мне совершенно по-барабану, кто правил тот код пять лет назад, Пупкин, Залупкин или Васечкин. Это абсолютно мусорная информация, но она преследует всю дорогу
63. Teplotrassamen 30.09.23 11:46 Сейчас в теме
(61) Так речь шла про расширения, что при добавлении нового реквизита у расширяемого объекта основной конфигурации, добавлять этому реквизиту префикс. Ну можно постфикс, но сама 1с при создании расширения прописывает префикс. Если не расширения, то согласен что так не надо делать.
14. Lemmonbri 142 27.09.23 14:35 Сейчас в теме
(13) Пункт называется "Не использовать префиксы и суффиксы без необходимости". В вашем случае это необходимо. В этом нет необходимости в случаях:
- если это переменная
- если это метод
- если это реквизит в самописном объекте метаданных
Что касается добавления реквизитов в расширяемые объекты - тут тоже не всегда используются префиксы. Если наименование точно не будет использоваться поставщиком (например, отраслевой термин не из отрасли конфигурации или сокращение, которое принято внутри компании), то префикс можно смело отбрасывать.
В общем случае префикс или суффикс без необходимости - плохо. Надеюсь моя мысль понятнее стала. Добавлю Ваше уточнение в статью пожалуй.
15. Teplotrassamen 27.09.23 14:42 Сейчас в теме
16. Serg2000mr 670 27.09.23 17:33 Сейчас в теме
Аргументы функций.
Максимум 2-4 аргумента. Однако есть хитрость: если у функции несколько аргументов их можно объединить в структуру, и передавать структуру как один аргумент.


Не то, чтобы хитрость, скорее требование к стандартам написания кода от 1С.
20. Lemmonbri 142 28.09.23 08:03 Сейчас в теме
(16) У нас нет требований. Стандарты - рекомендация.
29. Serg2000mr 670 28.09.23 09:16 Сейчас в теме
(20) Параметры процедур и функций :: Оформление модулей :: Система стандартов и методик разработки
При необходимости передавать в функцию большое число параметров рекомендуется:

группировать однотипные параметры в один или несколько составных параметров типа Структура. Например, в структуры могут быть объединены параметры, описывающие состав и значения полей некоторого объекта (ДанныеЗаполнения, ПараметрыПроведения, ДанныеФайла и т.п.);


Как по мне, называть хитростью то, что есть в стандартах - неверно.
30. Lemmonbri 142 28.09.23 09:23 Сейчас в теме
(29) Я не совсем понял для чего вы привели выдержку из стандартов, я вроде не отрицал что стандарты это рекомендуют. Я подчеркнул, что стандарты - не ТРЕБОВАНИЯ а РЕКОМЕНДАЦИЯ. Кстати в приведенной вами цитате там и написано "РЕКОМЕНДУЕТСЯ".
Что касается того, как называть это - хитрость или рекомендация стандартов, дело сугубо личное. Представление слова "хитрость" для меня и для вас может быть абсолютно разным. Я назвал хитростью, потому что фактически количество параметров не изменилось. Что было 20 параметров, завернули в структуру, так и осталось 20 параметров, только в обертке. Объем данных не уменьшился. Поэтому и называю хитростью. Могу назвать обманом неопытного юзера.
Вообще структуры в параметрах часто только к ухудшению понимания приводят, т.к. документацию к этим структурам никто не хочет писать. А ещё реже обновляют её при изменении количества параметров в структуре.
31. Serg2000mr 670 28.09.23 09:56 Сейчас в теме
(30) Понял: я придрался к слову "хитрость", вы придрались к слову "требования". Ок )
32. Lemmonbri 142 28.09.23 09:59 Сейчас в теме
(31) Это совершенно случайно получилось, честно)
Serg2000mr; +1 Ответить
17. muskul 28.09.23 02:17 Сейчас в теме
Процедура ОчиститьПоставщиковНоменклатуры()

как по мне так выглядит куда лучше и компактней. Помню "увидел" подобный стиль написание печатной формы, это было не возможно воспринимать цельно, потому что печать шапки была на 2 экрана вниз
21. Lemmonbri 142 28.09.23 08:09 Сейчас в теме
(17) Вся статья - сплошь субъективный взгляд. Если считаете так лучше - можете делать как хочется. Спасибо что комментарий написали! Мое мнение такое. Попробуйте разобраться в типовой ПФ, где там печать осуществляется, где области получают, где их заполняют и т.д. Там тоже не все так просто и зайдя в модуль не сразу разберешься. А ещё подход от формы к форме меняется.
На счет метода ОчиститьПоставщиковНоменклатуры тут пример сильно упрощен, там пару строк кода. На деле в ней может быть 500 или 1000 строк кода (в типовой и такое есть). И если такую уже декомпозировать - сильно проще жить становится. Это если вы про пункт "Компактность".
19. ImHunter 327 28.09.23 06:32 Сейчас в теме
(18) Начинающим я бы советовал сначала прочитать стандарты, методики и практики из ИТС. А потом уже обогащаться другими источниками.
22. Lemmonbri 142 28.09.23 08:10 Сейчас в теме
(19) Возможно, тут эффективность того или иного подхода сложно оценить, много факторов оказывают влияние, порой неизвестных факторов. Эта статья не только для начинающих, можно сказать она для всех. У нас в команде, например, чистый код изучают сразу после стандартов.
23. МимохожийОднако 142 28.09.23 08:15 Сейчас в теме
Общее впечатление: Статьи больше похожи на конспект-шпаргалку и начинающему сложно будет сходу применить их на практике, если под боком не будет наставника. На мой взгляд, было бы нагляднее каждый пункт статьи вместо отступлений в плюсике заменить наглядным примером: Плохой код, хороший код после применения данного метода.
24. Lemmonbri 142 28.09.23 08:17 Сейчас в теме
(23) Так там и есть пример плохого и хорошего кода...
Что касаемо начинающего без наставника - ничего хорошего из такого обучения не выйдет, у начинающих обязательно должен быть наставник.
36. МимохожийОднако 142 28.09.23 12:27 Сейчас в теме
(24) На мой взгляд примеры должны быть более приоритетными. Остальную пространную информацию я бы уменьшил. Но это конечно дело вкуса...
С наставниками начинают немногие. Большинство (как и я ) начинают в одиночку, по необходимости.
37. Lemmonbri 142 28.09.23 12:56 Сейчас в теме
(36) Примеры и для меня более приоритетными. Если вы можете сделать краткий пример, по которому все понятно как новичку, так и опытному - можете прислать, я заменю свои примеры. Пока что у меня получилось сделать в таком виде. Можно добавить большие примеры, на которых все понятно (как в книге), но порог вхождения вырастает в разы. Пока что остановился на таком варианте.
Касаемо наставника, многие или не многие - сложно судить. У всех разное окружение, в разных компаниях были. За всю страну тоже не скажешь. В моем окружении все начинали с наставником. В моем окружении все, кто приходил на новое место - был наставник.
Опять же повторюсь, я не говорю как надо делать, а как не надо. Я рассказываю как это сделано в нашей команде (в начале статьи писал об этом). В нашей команде у всех есть наставник в обязательном порядке.
МимохожийОднако; +1 Ответить
25. user1342811 19 28.09.23 08:23 Сейчас в теме
Вопрос по константам в том виде в каком они используются у Роберта Мартина.
Я сейчас использую функции, которые возвращают какое-то значение, потом в коде обращаюсь к этой функции избегая "магических чисел".
// Константа количество строк по умолчанию
//  
// Возвращаемое значение:
//  Число - 
Функция КОЛИЧЕСТВО_СТРОК_ПО_УМОЛЧАНИЮ()
	Возврат 5;
КонецФункции	
Показать

Не давно хотел на форуме обсудить эту тему, но был заклеван "труодинэснигами", и обсуждения не получилось.
Хотелось бы узнать мнение автора об этом.
native-api; Lemmonbri; +2 Ответить
26. Lemmonbri 142 28.09.23 08:27 Сейчас в теме
(25) Я считаю так: если константа нужна в пределах 1 метода, то целесообразнее объявить её в начале метода (или перед первым применением) с понятным именем. Если в пределах 1 модуля, то можно выносить в функцию. Если в пределах нескольких модулей, то в общий модуль.
В 1С нет как такового понятия констант на программном уровне (объект метаданных константа - немного другое, отличается от общепринятого понятия константы в программировании). Сонаркуб, например, рекомендует выносить магические числа в переменные непосредственно перед их использованием.
27. user1342811 19 28.09.23 08:36 Сейчас в теме
(26)
Ну я и в одном методе, если она используется в нескольких местах делаю через вызов функции, потом когда придёт время доделывать или исправлять, меньше вероятность, что кто-то по не знанию изменит переменную или передаст её в процедуру где она может быть также изменена.
28. Lemmonbri 142 28.09.23 08:37 Сейчас в теме
(27) Такой подход имеет место быть. Хотя я на практике не сталкивался с таким.
33. starik-2005 3087 28.09.23 10:49 Сейчас в теме
Я зашел в эту статью просто посмотреть (как на могилу продавца-консультанта). Такое на хабрах надо писать - там это любят. Там вообще любят все, что красиво звучит, даже если является бессмысленным и беспощадным.
oleg-m; cheshirshik; Dem1urg; Ravil_; dsdred; МимохожийОднако; +6 Ответить
34. booksfill 28.09.23 11:15 Сейчас в теме
Я читал, что новичков в боевых единоборствах сперва учат правильной стойке и технике удара, а на следующем уровне учат уже тому, что ни то, не другое не должно быть предсказуемым, а стиль "рваным".

Вот и в примерах из статьи хочется сказать: "вы книгу прочли, это - хорошо. А теперь переходите на следующий уровень".
И, чтобы не писать одно и тоже - я понимаю, что это примеры, но примеры не должны вводить в заблуждение.

============================================================­===========================
"Что скажите о переменной ЭлТЧФорма? "

Никакое "название" здесь вообще не удобно, т.к. самодокументированное название переменной, вы же за него ратуете?
Должно максимально соответствовать коду и "ломаться", если что-то поменялось.
Поэтому здесь уместно что-то вроде "Элементы.Товары" - везде, не надо эти самые "Элементы.Товары" пихать в промежуточную переменную.

============================================================­===========================
"ПолучитьТЗЗаказыКлиентовСДатамиПроведения"
Плохо (кстати, что вы там про венгерскую нотацию говорили?), т.к. когда вы решите, что надо возвращать не тз, а, например, массив структур, для передачи с клиента на сервер, имя метода вы скорее-всего не поменяете.
Понятно, что это из-за отсутствия типизации в 1С, увы, с этим что-то точно сделают в версии 1С 10.15.1890, надеюсь ...

============================================================­============================
"20 строк. Именно столько нужно для выполнения любой хорошо выделенной части кода на одном уровне абстракции"

Вы же сами догадываетесь, что что-то здесь не так. Помедитируйте, что произойдет, если вместо 20 подставить 21 или 19 или 100.
20 - не магическое число, а что-то для "прикинуть палец к носу", причем зачастую еще и применительно к конкретному языку программирования.

============================================================­=============================
"Из операций можно выделить следующие: изменение строки заказа, добавление данных в массив, изменение переменной, изменение документа. Так же здесь 3 уровня: переменные, строки заказа, документ заказа. Таким образом нужно выделить 2 метода."

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

============================================================­=====================================
"Использовать комментарий для пояснения сложного блока кода – плохо. Лучше сложный блок обернуть в метод и дать методу понятное наименование."


Вы как-то странно понимаете обязательные комментарии.
Комментарий, по-возможности, не должен описывать как код делает что-то "сложное", это да. Он должен пояснять почему это делается. Вы же сами про это написали, нет?

Например: "наличие промежуточной переменной при чтении файла в ComSafeArray средставами ADODB (проверено на версии 2.1) - обязательно, т.к. иначе при чтении больших файлов будут возникать не понятная ошибка MS SQL про невозможность чтения в image"


Про форматирование уж не буду - это тема пятничная, но, честно говоря, некоторые "хорошие" приемы вроде вставки пустой строки после каждой строки кода..., ладно - ладно не буду.
38. gybson 28.09.23 15:39 Сейчас в теме
(34)
Выглядит как пародия. Выделение методов, когда каждый метод используется только один раз и из метода, который состоит из небольшого кол-ва строк - это антипаттерн


Это же пример. Там весь кусок кода по сути бред. Конечно имеется в виду, что в реальности есть более осмысленный и большой кусок кода, который лучше декомпозировать.
39. Lemmonbri 142 28.09.23 15:42 Сейчас в теме
(38) Проблема приведения кода из реальных проектов:
- нужно приводить контекст задачи и бизнеса
- декомпозиция может быть огромной (самый простой функционал может занимать 10-15 методов)
Такое никому неинтересно читать. Поэтому привожу пример на кошках.
50. gybson 29.09.23 16:25 Сейчас в теме
(39) Это просто неэтично может быть. Я то не в претензии. Хотя конечно лучше потратить время на более вменяемый пример.
51. Lemmonbri 142 29.09.23 16:27 Сейчас в теме
(50) Я не против) У меня получилось как получилось. Если у вас есть более вменяемые примеры - присылайте, включу в статью, заменю свои на ваши, без проблем.
35. Lemmonbri 142 28.09.23 11:30 Сейчас в теме
(34)
""Что скажите о переменной ЭлТЧФорма? "

Никакое "название" здесь вообще не удобно, т.к. самодокументированное название переменной, вы же за него ратуете?
Должно максимально соответствовать коду и "ломаться", если что-то поменялось.
Поэтому здесь уместно что-то вроде "Элементы.Товары" - везде, не надо эти самые "Элементы.Товары" пихать в промежуточную переменную." - таким образом вы каждый раз читаете элемент вместо того чтобы его переиспользовать... 5 баллов. Про то, что все должно ломаться при изменениях я вообще не писал - не надо придумывать.
""ПолучитьТЗЗаказыКлиентовСДатамиПроведения"" - прочитайте другие комментарии, уже обсуждали это
"20 строк. Именно столько нужно для выполнения любой хорошо выделенной части кода на одном уровне абстракции" - посмотрите мой комментарий к этому. Я не увидел в вашем комментарии никакого обоснования, только абстрактные слова "помедитируйте" и "прикинуть палец к носу". Если есть что сказать по существу - так и напишите. Чего ребусы загадывать. А если не нельзя сказать ничего по существу - может и не стоит...
"Из операций можно выделить следующие: изменение строки заказа, добавление данных в массив, изменение переменной, изменение документа. Так же здесь 3 уровня: переменные, строки заказа, документ заказа. Таким образом нужно выделить 2 метода." - чтение вещь субъективная. На счет сопровождения все наоборот, появляется механизм переиспользования. Если уж говорите, что какой-то механизм ухудшает какой-то аспект, потрудитесь аргументировать. Иначе - субъективное мнение, так же как и чтение.
"Использовать комментарий для пояснения сложного блока кода – плохо. Лучше сложный блок обернуть в метод и дать методу понятное наименование." - в этом пункте я вообще не пишу про обязательные комментарии, видимо не очень внимательно читали.
"приемы вроде вставки пустой строки после каждой строки кода" - этого у меня вообще нет в статье, не надо придумывать.

Вы совсем не поняли мой посыл. Прочитайте самое начало. Это не свод обязательных правил, а РЕКОМЕНДАЦИИ. Рекомендации могут как навредить, так и помочь. Надо думать, где их применять. Вы привели пример с промежуточной переменной - используйте комментарий на здоровье. Если кто-то будет так комментировать каждую переменную (буквально каждую) - ну тут я бы уже к врачу посоветовал сходить.
40. sandr13 35 28.09.23 16:50 Сейчас в теме
Почему используются имена типа ТЗЗаказыКлиентов, а не ТЗ_заказы_клиентов? Последнее же читается лучше. Или "_" не все видят и замечают?
В последнем примере:
ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект();
ЗаказКлиентаОбъект.СуммаДокумента = СуммаТоваров; ЗаказКлиентаОбъект.Провести(РежимЗаписиДокумента.Проведение);
, но по той же идее должно быть:
ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект();

ЗаказКлиентаОбъект.СуммаДокумента = СуммаТоваров; ЗаказКлиентаОбъект.Провести(РежимЗаписиДокумента.Проведение);
42. Lemmonbri 142 28.09.23 16:56 Сейчас в теме
(40) И на сколько мне известно стандарты рекомендуют писать именно без использования "_" в наименованиях. К сожалению оперативно ссылку не могу прислать.
43. sandr13 35 28.09.23 17:01 Сейчас в теме
(42) Да помню встречал такое. Когда программировал на с++ пытался вводить, где только можно русские буквы, но к сожалению не везде прокатывало(.
41. Lemmonbri 142 28.09.23 16:55 Сейчас в теме
(40) Спецсимволов лучше избегать в любых ЯП. Это может привести к труднодиагностируемым проблемам (в том числе ядра, в нашем случае платформы).
"В последнем примере:" - я выделил область изменение заказа, в пределах такого уровня разделение не требуется. Если по коду приходится выделять другие области (получение объекта, изменение объекта, проведение), тогда конечно разделение рекомендуется. Тут много моментов, на которые с разных сторон можно смотреть. Ваш вариант тоже имеет место быть.
44. Infector 201 29.09.23 11:37 Сейчас в теме
В реальной жизни даже банальное вынесение текста относительно примитивного запроса в отдельную функцию заметно облегчает восприятие. Проблема в том, что встроенные в конфигуратор инструменты вроде "конструктора запроса с обработкой результата" генерируют как раз-таки код единой простыней. А если так сгенерировать печатную форму, то еще и заполнение параметров макета оказывается не совсем хорошо для практических целей реализовано.
45. Lemmonbri 142 29.09.23 11:38 Сейчас в теме
(44) Можно использовать шаблоны автозамены. С их помощью прекрасно можно вызвать конструктор запроса по закрытию которого запрос вынесется в отдельный метод, а обработка результата останется под курсором. Так что инструменты в конфигураторе для этого есть, и отличные.
46. cheshirshik 70 29.09.23 14:52 Сейчас в теме
Нету в 1С многопоточности. Есть фоновые задания, но они эмуляция многопоточности. И то эти фоновые задания запускаются друг за другом. К тому же в 1С есть определенные ограничения. Если запускать кучу регламентных заданий под разными пользователями, то спокойно можно положить сервер.

Ну и еще из практики. Значительного прироста в выполеннии алгоритмов потоками 1С не дает. Прирост в 15-20% по времени.

Но с автором согласен. Так называемую "многопоточность" делать сложно.
Lemmonbri; +1 Ответить
49. gybson 29.09.23 16:23 Сейчас в теме
(46) Делал загрузку данных из внешнего источника через ADO, данные возвращались хранимыми процедурами. В общем время уменьшалось практически кратно количеству заданий. Запускаешь одно - 30 минут, запускаешь 30 - одна минута.
Не так сложно, как кажется. Через БСП запустить процедуру в фоне дело плевое.
52. Lemmonbri 142 29.09.23 16:31 Сейчас в теме
(49) Тут много факторов: смотря какой алгоритм, какие данные использует, кем написан. Может быть там запросы в цикле и взаимные блокировки. Может быть там ограничение сервера по железу. Может там другие особенности, которые не дают значительной эффективности в многопотоке. Я как раз пишу - чтобы использовать многопоток его надо должным образом изучить. И понимать, когда будет эффективность, а когда нет. Лепить везде и всюду - бессмысленно.
cheshirshik; +1 Ответить
54. cheshirshik 70 29.09.23 16:39 Сейчас в теме
(52)

Есть такой принцип в программировании. Его кстати не увидел в Вашем посте. Этот принцип называется KISS. Спойлерить не буду. Сами прочитайте.

Этот принцип я тоже использую на своих проектах.
56. Lemmonbri 142 29.09.23 16:42 Сейчас в теме
(54) Я всегда "за" изучение нового. Спасибо, добавил в свой список для изучения.
53. cheshirshik 70 29.09.23 16:31 Сейчас в теме
(49)

А теперь давайте представим, что будет с сервером, если эти 30ть регламентных заданий запустит ну скажем 100 пользователей одновременно?

И я не спорю, что будет быстрее. Будет. Но какой ценой? И разве фоновое задание это многопоточность? Многопоточность в нормальных языках программирования делается на уровне операционной системы, а не копией программы в оперативке.
67. gybson 01.10.23 10:36 Сейчас в теме
(53)давайте представим, что 3000000000 пользователей запустят, потом, что 50000000000, замечательно проведем время
BomjBandit; +1 1 Ответить
102. cheshirshik 70 07.10.23 00:01 Сейчас в теме
(67)

Я понимаю, что у вас в коллективе две бухгалтершы Клавы, главбук Ася и с десякок менеджеров. Но так бывает не везде. В некоторых огранизациях один НР отдел из 5ти человек, а с базой работет не пара менеджеров, а 1000 человек одновременно вбивают расходные накладные, а тут программист Вася решил, что запустить одновременно 100 фоновых заданий под учеткой менеджера будет хорошей идеей. А что будет с сервером 1С? Он потянет нагрузку? Или программисту Васе пофигу. Ему виднее сколько под одной учеткой должно взлететь фоновых заданий, которые при этом родят взаимные блокировки.

А я отвечу. Завод встанет и весь 1С отдел поднимут на уши. И все будут бегать и разбираться, почему 1С сервер снова вдруг внезапно упал.

П.с. И это не шутка. У нас на заводе была похожая ситуация. Правда виновник торжества был до этого уволен, но следы в ситеме были оставлены. Мина замедленного действия сработала.
104. gybson 07.10.23 19:47 Сейчас в теме
(102) А если 5 бухгалтеров? Тогда Вам надо заново все переписывать и переосмысливать концепцию.

Я видел много вот таких специалистов, которые выросли на крови, поте и слезах. Не просто выросли, а не смогли сделать из этого никаких выводов и ничему не учатся и до сих пор так и живут в крови, слезах и поте. Жалкое зрелище.

Правило первое - умейте ограничивать свою фантазию.

Потому, что всегда оказывается, что "ТОЧНО ТАКАЯ ЖЕ!!!!!" ситуация, это сервер с полки уронили. Но в остальном все один в один.

P.S. Я рекомендую вам тестировать код централизовано. Тогда вы уже на тестах увидите проблемы и не надо будет никого увольнять.
105. gybson 07.10.23 19:49 Сейчас в теме
(102) Отдельно замечу, что Ваш KISS очень впечатляет =) Я бы сказал разит наповал =)
106. cheshirshik 70 08.10.23 00:08 Сейчас в теме
(105)

Kiss - Метод рабочий. Если пишите код, то надо смотреть на перспективу. Писать сразу с учётом возможной нагрузки. Тогда и переписывать ничего не придётся.

P.s. после того, как мы поняли, кто наговнокодил, код псевдо спеца мы закомменировали. Сервер поле этого вернулся в строй и сбоев с взаимными блокировками мы не увидели.
107. gybson 08.10.23 14:06 Сейчас в теме
(106) Все правильно. Но "Делай хорошо и будет хорошо, а чтобы сделать лучше, делай лучше и никогда не делай плохо" это не Kiss, а недержание речи.
108. cheshirshik 70 08.10.23 17:25 Сейчас в теме
(107)

Ну если вы у нас так хорошо владеете подходом KISS, так расскажите о своём опыте. Очень интересно.
47. 1CUnlimited 320 29.09.23 16:04 Сейчас в теме
В 1С ограниченные инструменты для построения хорошей структуры кода. По сути прикладные метаданные выглядят как объекты\классы , а код сам процедурный. Если бы кроме общих модулей можно было бы создавать классы как в ООП тогда все упростилось бы. Ярким примером является реализация БСП - он полуфабрикат в отличие о классической библиотеки, которую в других языка можно импортировать. Т.е. вы не можете сразу использовать БСП в Нетиповой конфигурации, а сразу можно только в типовой где он уже собран.
А пока нет возможности делится готовыми и работающими везде библиотеками, до clean code будет как до луны.

Многопоточность и длительные операции полезны только при большом объеме данных. На их реализацию необходимо дополнительное время. Не следует реализовывать многопоточность и длительные операции без должного изучения.

Там нет большого дополнительного времени, если вести изначально доработки и разработку с учетом возможности многопоточности. Просто откладывая на потом Вы достигнете пределов решения слишком быстро, а переписывать это никто не будет - проще написать новое
48. Lemmonbri 142 29.09.23 16:09 Сейчас в теме
(47) Кстати о библиотеках. Недавно подумал, что расширение по сути является библиотекой. Сделал общий модуль, в нем экспортные методы и вот оно - расширение кода, чистая библиотека.

(47)
А пока нет возможности делится готовыми и работающими везде библиотеками, до clean code будет как до луны.
Ну тут я не согласен. Чистый код улучшает сопровождаемость, что в 1С очень актуально. Ускоряет разработку модулей. Почему нет? Почему вы связываете понятие чистого кода только с библиотеками?

Кстати, если принять что библиотека = расширение, то даже по вашей логике все хорошо становится.
55. 1CUnlimited 320 29.09.23 16:40 Сейчас в теме
(48)
Ну тут я не согласен. Чистый код улучшает сопровождаемость, что в 1С очень актуально. Ускоряет разработку модулей. Почему нет? Почему вы связываете понятие чистого кода только с библиотеками?

Я не связываю это только с библиотеками , а просто утверждаю что без нормального code reuse, который обеспечивают библиотеки чистого кода не будет. Будет чистая и красивая копипаста, мы же не просто пишем код, а максимально стараемся чтобы он повторно использовался??? и так кругом велосипеды.

Просто нужно сопоставить какой нибудь системный язык типа Java или C# c 1С в части структуры кода, чтобы почувствовать разницу.

А расширение это очередной трюк 1С подмены кода на лету, дабы не портить типовые конфигурации прямым вмешательством. Ведь больша связанность конфигурации и отсуствие понятия "интерфейс" внутри языка не оставляет других вариантов
ivanov660; Lemmonbri; +2 Ответить
57. cheshirshik 70 29.09.23 23:17 Сейчас в теме
(55)

Мне кажется вы немного путаете нормалный язык ООП с конфигуратором 1С. С моей точки зрения это вообще не язык программирования. Это скорее язык конфигурирования платформы. Все те кто столкнулся с ограничениями 1С уже давно на нормальных языках ООП вроде джавы.

У 1с много минусов. Да. Но есть и плюсы. Например можно писать и отлаживать куски кода прямо в обработке компилируя код на лету без перекомпиляции проекта. Можно использовать удобный мастер отчетов. Можно вообще не кодить, а использовать формы гененируемые конфигуратором и прочее. Создавая справочник вы сразу пишите его в базу и описываете логику взаимодействия с другими объектами. Есть удобные регистры, где все итоги уже посчитаны и где достаточно использовать виртуальные таблицы для доступа к данным. И много еще разных плюшек...

Бизнесу на самом деле наплевать на красивые кнопочки и кастомный интерфейс. Бизнес хочет быстрых и эффективных решений. 1С - как платформа решает эти задачи.

П.с.

Если очень хочется ООП в 1с, то на инфостате полно статей про эмуляцию ООП. Даже я в своих проектах эмулирую работу ООП. Например можно обработку использовать как объект. Так например в ЗУП делается расчет зарплаты. Исходные данные передаются в обрабработку (объект) она что-то там делает и в экспортную переменную (свойство объекта) записывает данные расчета.
68. alex_sayan 51 02.10.23 04:59 Сейчас в теме
(57)
Бизнес хочет быстрых и эффективных решений


Быстрые и эффективные решения это миф, созданный 1с. Ну, пока клепается простенькая конфигурация для ларька, функционал льётся как из ведра. Но в огромных корпорациях разработка на 1с превращается в черепаху, плетется не быстрее разработки на той же Java
103. cheshirshik 70 07.10.23 00:16 Сейчас в теме
(68)

Фирма занимается разработкой на Джава. У них бизнес растет и у гениального топа вонзникает идея. А почему бы нам бухню не написать на Джава? Ведь мы же можем? Можем. Все топы собираются. Прикидывают бюджет и тут внезапно выясняется, что купить типовую БП за 15к рублей гораздо дешевле, чем с нуля написать тот же проект на Джава. И так уважаемве товарищи знатоки вопрос. Что решили топы? Разрабатывать свое решение на Джава или купить коробку БП за 15к?
58. 1CUnlimited 320 29.09.23 23:45 Сейчас в теме
(57)
Мне кажется вы немного путаете нормалный язык ООП с конфигуратором 1С. С моей точки зрения это вообще не язык программирования.

Я не путаю, просто считаю что язык 1С нужно использовать ровно на его возможности. А возможности можно осознать зная продвинутый язык ООП . Тогда и не нужно эмуляций
59. cheshirshik 70 30.09.23 07:37 Сейчас в теме
(58)

Дело в том, что мы программисты. Наша работа творческая. Если есть задача и для того, чтобы ее быстро решить нужно сделать эмуляцию ООП, то почему нет? Все в рамках правил 1с.
69. alex_sayan 51 02.10.23 05:03 Сейчас в теме
(59) ООП это не про быстроту. ООП создавали чтобы дать программистам инструмент для борьбы со сложностью в коде
ImHunter; +1 Ответить
71. cheshirshik 70 02.10.23 09:43 Сейчас в теме
(69)
ООП это не про быстроту.


А вот тут я не соглашусь. Например наследования. Один раз описываешь объект и потом его свойства и методы можно наследовать "детям". Т.е. тебе не надо заново писать код. Все написано в родителе. Т.о. время разработки уменьшается.
80. alex_sayan 51 02.10.23 11:27 Сейчас в теме
(71) серьёзно?) Написал один раз экспортный метод, дёргаешь его из разных модулей, и "тебе не надо заново писать код"
86. cheshirshik 70 02.10.23 12:38 Сейчас в теме
(80)

Речь про объект ООП в нормальном языке программирования вроде Джава, а не про экспортную процедуру общего модуля в 1С.
88. alex_sayan 51 02.10.23 14:01 Сейчас в теме
(86) ну, я про ООП-языки типа Java и говорю. Повторно использовать код можно в абсолютно любом языке программирования. ООП тут ничем не примечателен. Наследование лишь один из способов повторно использовать код. А код:
Объект.Действие()

и
Действие(Объект)

суть одно и то же.
Я даже больше скажу, в модном-молодёжном и стремительно набирающем популярность языке Golang, его создатель Google преднамеренно отказался от ООП, оставив лишь некоторые элементы ООП. Ибо ООП ни разу не серебрянная пуля
NeLenin; cheshirshik; +2 Ответить
91. cheshirshik 70 02.10.23 14:51 Сейчас в теме
(88)
Ибо ООП ни разу не серебрянная пуля


Но тут я согласен. Вообще механизмы близкие к ООП я даже в языке ООП использовал редко, но использовал. В 1с сейчас вообще никакого неудобства не испытываю. Мне вполне язык 1с устраивает. Все задачи по автомазитазции бизнес процессов я успешно решаю.
62. 1CUnlimited 320 30.09.23 11:38 Сейчас в теме
(59) Ок, попробуйте "эмуляцию " вот такой простой но необходимой задачи на 1с https://infostart.ru/1c/articles/1823770/ на 1С
Мне кажется результат и трудоемкость использования Вам самому не понравится
В других языках есть как минимум разные методы этого достичь.
Поэтому как только на 1С нужно делать костыли, сразу смотрим в сторону вебсервиса на другом языке
64. cheshirshik 70 30.09.23 18:40 Сейчас в теме
(62)

Очень специфическая задача для 1с. Тут я думаю главное понять, а нужно ли ее решать в рамках 1с? Может эффективнее это делать на джава?

1с не универсальна. Ее цель решать бизнес задачи. Автоматизировать бизнес. С этой задачей 1с легко справляется.

Ну а для остального есть другие языки программирования. Зачем для этого использовать 1с мне не понятно.
66. 1CUnlimited 320 30.09.23 19:56 Сейчас в теме
(64)решив эту специфическую задачу можно построить нормальную БСП . Бсп это общая или специфическая задача? ;)
Сейчас даже подсистему Конграгенты нужно пересобирать под свое решение каждый раз (реквизит или название другое).
Вы тупо не можете новую БСП использовать со старым релизом Бух 3.0 поскольку обратной совместимости нет.
Т.е. БСП это не библиотека , а куски кода "доделай сам"
Тут не универсальности дело, вы просто даже свои pattern программирования не сможете демонстрировать поскольку самая маленькая единица распространения clean code это даже не подсистема, а конфигурация.
Я видел как сравнением и обьединением поженили пару конф Раруса и Бухгалтерию. Это выглядело ужасно, лучше уж через ole или вебсервисами
70. cheshirshik 70 02.10.23 09:39 Сейчас в теме
(66)

(66)
решив эту специфическую задачу можно построить нормальную БСП . Бсп это общая или специфическая задача? ;)


Если так можно было, то почему 1С так не сделало? Странно. Не находите?


(66)
Вы тупо не можете новую БСП использовать со старым релизом Бух 3.0 поскольку обратной совместимости нет.


Вот тут тоже все странновато выглядит. Я всегда думал, что новая версия БСП выходит с новым релизом БП? Или не так? Может надо просто вовремя обновлять БП, а не изобретать костыли и велосипеды?

(66)
Т.е. БСП это не библиотека , а куски кода "доделай сам"


Не надо путать библиотеки написанные на нормальных языках программирования с библиотеками написанными для конфигурирования на 1С. Это разные библиотеки. Я соглашусь с тем, что это куски кода, которые надо адаптировать, а разве при использовании DLL библиотеки в вашей программе не надо допиливать код?

П.с. если вам тах не хватает ООП, то почему вы еще здесь, а не на форуме Джава разрабов например? Там тоже нюансов и "радостей" хватает. В джава например нет нормальных конструкторов запросов или внешних обработок. На сколько я знаю, там надо каждый раз перекомпилировать проект, а на 1с этого можно не делать. Так что и на Джава и на 1С есть свои плюсы и минусы.
92. 1CUnlimited 320 02.10.23 14:52 Сейчас в теме
(70)
(70)
Вот тут тоже все странновато выглядит. Я всегда думал, что новая версия БСП выходит с новым релизом БП? Или не так? Может надо просто вовремя обновлять БП, а не изобретать костыли и велосипеды?

БСП собрана и работает только в рамках какой нибудь типовой конфигурации. А если вы написали свою? Тогда обновление БСП подразумевает ее сборку на уровне кусков кода, это совершенно не мотивирует ее использовать. Есть Демо БСП которая собрана, но она ограниченного применения

решив эту специфическую задачу можно построить нормальную БСП . Бсп это общая или специфическая задача? ;)


Если так можно было, то почему 1С так не сделало? Странно. Не находите?

Ну это рассуждения в стиле Жираф большой ему видней, и просто не замечает что у него под ногами.
1С например, в век многоядерности даже в своих типовых распараллеливание обработки пакетами почти не использует . Я про это https://infostart.ru/1c/articles/1683197/
. Странно , не находите?
93. cheshirshik 70 02.10.23 14:58 Сейчас в теме
(92)
1С например, в век многоядерности даже в своих типовых распараллеливание обработки пакетами почти не использует .


Я тоже считаю, что механизмы 1с устарели. Нет многопоточности. Это правда. Попытки перейти на современные ИДЕ вроде ЕДТ похвальны, но сколько раз я пробовал отказаться от конфигуратора и перейти на разработку в ЕДТ, то каждый раз сталкивался с тем, что ЕДТ пока еще сырой. Увы.

Да и вообще. Конфигуратор для ЕДТ запущенный в фоне я считаю КОСТЫЛЕМ. Вот когда ЕДТ напрямую в субд будет лить конфигурацию, как это делает конфигуратор, вот тогда думаю можно будет смело на него переходить.
1CUnlimited; +1 Ответить
65. Cyberhawk 135 30.09.23 19:47 Сейчас в теме
В данном случае непонятно, что делает функция ИзменитьРеквизит и почему она используется в условии. Для данного случая следует создать 2 функции: первая, которая изменяет реквизит, и вторая, которая проверяет, что реквизиту задано соответствующее значение.

Если Не ПроверитьРеквизит("Имя", "Иван") Тогда
    ИзменитьРеквизит("Имя", "Иван");
КонецЕсли;

И теперь абсолютно во всех точках вызова мы обречены писать этот трехстрочный блок из двух функций?
76. Lemmonbri 142 02.10.23 11:07 Сейчас в теме
(65) Не во всех, а только там, где требуется проверить И изменить. Вы же везде (почти везде), где вам надо создать новый запрос, пишете проверку на пустой запрос? А только потом делаете чтение? Таких примеров полно. Взять то же проведение по стандартам. Всегда же надо блокировки писать. Так что я вообще не понимаю недовольство. Или вы хотите одну большую процедуру "сделать все красиво и быстро"? Если считаете, что пример плохой - приведите альтернативу.
79. Cyberhawk 135 02.10.23 11:25 Сейчас в теме
(76)
Не во всех, а только там, где требуется проверить И изменить
Мы же ведем речь о рефакторинге "старой" функции, а значит абсолютно во всех точках вызова этой "старой" функции нам требовалось сделать два действия - и проверять, и изменять.
Что нам дает эта разбивка?
81. Lemmonbri 142 02.10.23 11:28 Сейчас в теме
(79) При любом рефакторинге вы будете менять все точки. Разбивка, как я уже писал, дает более понятный результат выполнения. Конкретно в данном примере если вы проверите с именем "Василий" в первом случае, то внезапно для вас имя поменяется на Василий. Это побочное действие. Вы получаете после рефакторинга больший контроль и понятность.
Вообще если вы задаете такие вопросы, я не очень понимаю зачем вам эта статья.
82. Cyberhawk 135 02.10.23 11:34 Сейчас в теме
(81)
При любом рефакторинге вы будете менять все точки. Разбивка, как я уже писал, дает более понятный результат выполнения
Появляется многократное дублирование кода во всех точках вызова - вместо одной строки вызова теперь везде будет блок "Если" из трех одинаковых строк (у которых еще и параметры двух новых методов повторяются).
Или это за дублирование не считается?
Как вообще понять, когда такое оправдано, а когда нет?
83. Lemmonbri 142 02.10.23 11:41 Сейчас в теме
(82) Ещё раз, это будет только там, где требуется проверка И изменение одновременно. Вам придется задуматься в каждом изменяемом место, а нужна ли здесь проверка (спойлер: проверка не нужна при записи данных).
Как понять? Ответ: никак. Если вас устраивает побочное действие метода и вы на 100500% уверены что больше никто и никогда не полезет в этот код - не меняйте.
Ещё раз привожу пример с запросом: при каждом запросе проверка на пустой результат.
Дублирование - это когда вы пишете один и тот же код много раз вместо того чтобы завернуть его в метод. Если эти 3 строки по логике вашей работы можно завернуть в один метод - пожалуйста. Но если вам нужно по отдельности проверять и изменять - вам придется это прописывать везде. Вы ведь не сможете это завернуть в один метод.
Кстати блок "Если" не будет из одинаковых строк. Параметры всегда будут разные. Даже может возникнуть ситуация, когда проверка идет на одно имя, а записывается другое. Все зависит от контекста и задачи.
84. Cyberhawk 135 02.10.23 11:48 Сейчас в теме
(83)
Если эти 3 строки по логике вашей работы можно завернуть в один метод - пожалуйста
Разве это как раз и не было сделано в "старом" варианте метода? Его автор понял, что он везде, где изменяет, сначала что-то проверяет, поэтому это и сделано в одном методе.
А других вводных в статье вы не дали (касательно потребности отдельно изменять без проверки, или что проверка на один реквизит, а запись на другой). В таком случае может следует просто дать "старому" методу более понятное имя?
85. Lemmonbri 142 02.10.23 11:56 Сейчас в теме
(84) А с чего вы решили, что
(84)
Его автор понял, что он везде, где изменяет, сначала что-то проверяет
? Я таких вводных так же не давал. Этот пример оторван от контекста. Показываю в нем как может метод делать дополнительные "подлянки".
73. artbear 1563 02.10.23 10:53 Сейчас в теме
Очень много вредных примеров буквально с первых советов (

примеры:
- 1 ПолучитьДанныеХХХ или ПолучитьТаблицуХХХ - плохой пример. оба начальных слова несут шум и затрудняют понимание.
использование Получить вообще плохой паттерн.

- 2 метод ОчиститьПоставщиковНоменклатуры делает совершенно другое (

и т.п. и т.д.
75. Lemmonbri 142 02.10.23 11:05 Сейчас в теме
(73)
2 метод ОчиститьПоставщиковНоменклатуры делает совершенно другое (
Почему же другое? Там буквально получается объект Товар и удаляются все его поставщики.
(73)
использование Получить вообще плохой паттерн.
Ссылка на авторитетные источники есть? Стандарты? Известные авторы? Если это ваше субъективное мнение - то добавьте в комментарий "По моему мнению очень много...".
77. artbear 1563 02.10.23 11:09 Сейчас в теме
(75)
ОчиститьПоставщиковНоменклатуры

Внимательно посмотрите на ВЕСЬ текст, у вас куча методов с таким названием
Lemmonbri; +1 Ответить
78. Lemmonbri 142 02.10.23 11:14 Сейчас в теме
(77) Что-то пошло не так после 1 метода... Поправил наименования. На счет паттерна вы так и не ответили, кстати.
87. cheshirshik 70 02.10.23 12:43 Сейчас в теме
(75)
Ссылка на авторитетные источники есть? Стандарты? Известные авторы? Если это ваше субъективное мнение - то добавьте в комментарий "По моему мнению очень много...".


Опять, таки возвращаемся к старым проблемам. Посмотрите стандарты разработки 1с. Там описано, как надо правильно называть процедуры и функции.
Оставьте свое сообщение