Трюкачество как плохой код

Меня попросили ответить, что выдаст код:

Процедура ОбщийТест()
	
	Массив = Новый Массив; 
	МойМодуль.ИзменениеМассива(Массив);
	Сообщить(Массив.Количество());

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


//МойМодуль
Процедура ИзменениеМассива(Знач Массив) Экспорт

	Массив.Добавить(42);

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

Я сначала ответил 1, а потом заметил что Массив передается по значению и ответил 0.

На что вопрошающий радостно ответил, что я «плохо знаю 1С», мол, если массив передается по ссылке, то он все равно меняется.

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

Вот даже попросил ИИ прокомментировать этот случай.

[Gemini 3.7 Flash 🌐]

Изменение массива, переданного по значению, но оказавшегося измеряемым внешне, не является признаком хорошего кода. Это создает скрытые побочные эффекты (side effects), усложняет отладку и нарушает принцип наименьшей неожиданности (Principle of Least Astonishment).

Поведение массива после возврата из функции в разных языках

Поведение зависит от того, передается ли «по значению» сам массив (копируются данные) или передается по значению ссылка/указатель на массив.

Как называются такие решения в программировании

⦁ Неявный побочный эффект (Implicit Side Effect): Когда функция делает что-то помимо возврата значения, о чем не написано в ее названии.
⦁ Трюкачество / Говнокод (Clever Code / Code Smell): Использование неочевидных механизмов языка ради «красоты» или экономии строк в ущерб читаемости.
⦁ Ловушка / Подводный камень (Gotcha / Pitfall): Специфическое поведение языка, в которое легко попасть по незнанию (например, неявная передача по ссылке).
⦁ Зацепление по содержанию (Content Coupling): Ситуация, когда одна часть программы напрямую меняет внутреннее состояние другой.
Для чистоты кода рекомендуется либо явно делать функцию чистой (возвращать новый массив), либо явно указывать модификацию в названии и ключевых словах (например, ref / out в C# или pass-by-reference &mut в C++/Rust).

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

комментариев 14

  1. rzd:

    Так ты знаешь правильный ответ в примере?

    • мне не интересен правильный ответ в плохом коде. надеюсь это понятно?
      этот код нуждается в рефакторинге.

      • rzd:

        это код всего лишь тест. А ты до сих пор не знаешь на него ответ. Живи с этим

        • я ответ написал в этой статье. хотя в целом мне такие нюансы кривокодирования не интересны. на практике не применимо.

  2. Verdoga:

    Дед, не хочу про это, но то, что ты шабашник 1С это видно в коде. Вот из последнего твоего «творения» — это пиздец конечно.

    Сообщить(
    «У товара перемещается: » + Выборка.Количество
    + » на остатке: » + Выборка.Остаток
    + » после проведения остаток: » + Остаток
    + «, что меньше допустимого: » + ДопустимыйПорогОстатка + «! »
    + » » + Выборка.Номенклатура + » » + Выборка.Характеристика);

    В моей конторе даже джун такое не пишет, а почему ? А потому что он знаком со стандартами разработки 1С.
    »
    2. В том случае если строка является составной и включает в себя части, зависящие от тех или иных условий, тем не менее, следует использовать логически завершенные, целостные фразы (предложения). Необходимо применять функцию СтрШаблон (или аналогичную) для подстановки параметров в строки сообщений пользователю.

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

    Неправильно:

    СообщениеОНехватке = «Не хватает товара » + НаименованиеТовара + » на складе » + НаименованиеСклада + «.»;
    Правильно:

    ТекстСообщения = НСтр(«ru = ‘Не хватает товара %1 на складе %2.'»);
    СообщениеОНехватке = СтрШаблон(ТекстСообщения, НаименованиеТовара, НаименованиеСклада);»

    Не благодари.

  3. Serg:

    Тебя не спрашивали, хороший ли это код. Тебя спрашивали, что он выведет. Ты ответил неправильно. К чему рассуждения о трюкачестве-то?

    • я ответил в статье. если вы не уловили суть, вам не стоит в 1с. в 1С важно улавливать желания клиента, тут не работают по строгому ТЗ.

      • rzd:

        Я правильно понял, что полного ответа ты не знаешь?

      • Serg:

        Причём тут желания клиента? Вопрос был про язык, а не про его применение. Ты когда математику в институте решал, тоже вопил про желания заказчиков? Или когда на собесе спрашивают «что выведет следующий код», ты тоже кричишь, что он плохой?

        • в чем ваш вопрос, не уловил? Напишите целиком.

          • Serg:

            Тебе задали вопрос, что выведет конкретный код, не связанный с какой-либо реальной задачей. Зачем ты стал оценивать этот код? Хочешь этим нивелировать то, что неправильно ответил?

          • я ответил неправильно. и написал, почему меня это не беспокоит.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *