Оператор with

b

Происхождение: как оператор with вошел в язык

Оператор with появился в языке Pascal задолго до появления Delphi. В оригинальной спецификации Никлауса Вирта он рассматривался как средство сокращения кода при работе с записями (record). Когда корпорация Borland развивала Turbo Pascal, а затем и Delphi, синтаксис with был расширен для работы с объектами. В середине 1990-х годов, когда Delphi 1.0 только начинал свой путь, разработчики воспринимали with как естественный инструмент: он позволял быстро обращаться к полям формы или к компонентам, не повторяя длинные имена. Это было особенно актуально в эпоху, когда автодополнение кода (Code Completion) ещё не было столь развитым. В те годы мнение сообщества было однозначным: with ускоряет написание кода и делает его компактнее.

Развитие и переосмысление: первые тревожные сигналы

По мере того как проекты на Delphi становились крупнее, у опытных разработчиков начало нарастать беспокойство. Оператор with создавал ситуации двусмысленности (ambiguity), когда было непонятно, к какому объекту или записи относится то или иное поле. Первые громкие обсуждения на форумах (например, в Borland Newsgroups) начались в конце 1990-х годов. Марко Канту (Marco Cantù) — один из ведущих экспертов по Delphi — в своих книгах упоминал, что with часто приводит к ошибкам, которые трудно обнаружить при рефакторинге. Тем не менее, Borland (а затем Embarcadero) не удаляла оператор из языка, сохраняя обратную совместимость. В 2000-е годы сформировалось два лагеря: одни считали with опасным пережитком, другие — удобным инструментом при правильном использовании.

Современное состояние: где мы находимся в 2026 году

Сегодня, в 2026 году, дискуссия вокруг with в Delphi не утихает, хотя тон изменился. С одной стороны, современные IDE (RAD Studio, Lazarus) предоставляют мощные средства навигации и рефакторинга, которые снижают потребность в сокращении кода. С другой стороны, в крупных корпоративных проектах по-прежнему встречаются миллионы строк старого кода, густо усеянного with. Актуальные тенденции таковы:

Почему эта тема важна сейчас

Вопреки мнению, что Delphi — “вымирающий” язык, он жив и активно применяется в узких нишах: медицинское оборудование, логистические системы, автоматизация промышленности. Ежегодно выходят новые версии RAD Studio, и поддержка with остаётся неизменной. Однако цена ошибки при неправильном использовании with в таких системах может быть очень высока (например, сбой в управлении роботом или неверная обработка данных пациента). Поэтому понимание истории, рисков и современных альтернатив (локальные переменные, цепочки вызовов, records с методами) становится критически важным для каждого, кто пишет на Delphi в 2026 году.

Рекомендации по применению (проверенные практики)

  1. Избегайте вложенных конструкций: вложенные with (два и более уровня) почти гарантированно приводят к путанице. Если такое встречается в проекте — это повод для немедленного рефакторинга.
  2. Предпочитайте явные ссылки: современный код выигрывает от читаемости. Вместо with Form1 do Caption := '...'; пишите Form1.Caption := '...';. Это незначительно увеличивает объём, но радикально упрощает отладку.
  3. Используйте with для коротких scope-блоков: если оператор охватывает не более 2–3 строк и однозначен, его применение допустимо. Например, инициализация полей записи в конструкторе.
  4. Устанавливайте линтер: настройте правила статического анализа, чтобы предупреждать о with в коде. Это дисциплинирует команду и предотвращает случайное попадание опасных конструкций в репозиторий.
  5. Документируйте исключения: если в проекте всё же используется with, в комментариях к такому блоку следует пояснить, почему отказ от него невозможен (например, из-за сложной метапрограммируемой структуры).

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

Добавлено: 27.04.2026