Оператор with

Происхождение: как оператор 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, заменяя
withна явные обращения к полям. Это повышает читаемость и упрощает интеграцию с новыми системами. - Корпоративные стандарты: в ряде компаний приняты внутренние код-гайды, полностью запрещающие использование
with. В других — разрешают, но только для коротких блоков в одну-две строки. - Новые поколения разработчиков: те, кто приходит в Delphi из C# или Java, чаще всего воспринимают
withкак чуждый элемент, так как в этих языках подобного синтаксиса нет. - Инструменты анализа: современные статические анализаторы (Pascal Analyzer, SonarQube с Delphi-плагинами) помечают
withкак потенциальный дефект, что подталкивает к отказу от него.
Почему эта тема важна сейчас
Вопреки мнению, что Delphi — “вымирающий” язык, он жив и активно применяется в узких нишах: медицинское оборудование, логистические системы, автоматизация промышленности. Ежегодно выходят новые версии RAD Studio, и поддержка with остаётся неизменной. Однако цена ошибки при неправильном использовании with в таких системах может быть очень высока (например, сбой в управлении роботом или неверная обработка данных пациента). Поэтому понимание истории, рисков и современных альтернатив (локальные переменные, цепочки вызовов, records с методами) становится критически важным для каждого, кто пишет на Delphi в 2026 году.
Рекомендации по применению (проверенные практики)
- Избегайте вложенных конструкций: вложенные
with(два и более уровня) почти гарантированно приводят к путанице. Если такое встречается в проекте — это повод для немедленного рефакторинга. - Предпочитайте явные ссылки: современный код выигрывает от читаемости. Вместо
with Form1 do Caption := '...';пишитеForm1.Caption := '...';. Это незначительно увеличивает объём, но радикально упрощает отладку. - Используйте with для коротких scope-блоков: если оператор охватывает не более 2–3 строк и однозначен, его применение допустимо. Например, инициализация полей записи в конструкторе.
- Устанавливайте линтер: настройте правила статического анализа, чтобы предупреждать о
withв коде. Это дисциплинирует команду и предотвращает случайное попадание опасных конструкций в репозиторий. - Документируйте исключения: если в проекте всё же используется
with, в комментариях к такому блоку следует пояснить, почему отказ от него невозможен (например, из-за сложной метапрограммируемой структуры).
Таким образом, оператор with в Delphi представляет собой яркий пример того, как исторически удобный инструмент со временем становится источником проблем. Понимание его эволюции и текущих трендов позволяет разработчикам принимать осознанные решения, поддерживая код в актуальном и надёжном состоянии.
Добавлено: 27.04.2026
