Псевдонимы (ALIAS)

d

Псевдонимы (ALIAS) в Delphi: что скрывается за простым объявлением

На первый взгляд, механизм псевдонимов (alias) в Delphi выглядит тривиально — вы просто даёте типу другое имя. Однако за этой кажущейся простотой прячутся ловушки, способные превратить стабильный код в источник трудноуловимых багов. Ниже — взгляд на эту тему с позиции разработчика, который уже наступал на эти грабли и знает, как их обойти.

Строгая типизация: ваш главный союзник и потенциальный враг

Многие полагают, что type TMyInt = Integer; — это просто синоним. На деле компилятор считает их разными типами. Ошибка №1: попытка передать переменную TMyInt в процедуру, ожидающую Integer, без явного приведения. Да, неявное преобразование не сработает, если вы не используете type TMyInt = type Integer; (строгий alias). Совет эксперта: всегда используйте строгий alias (type ... = type ...) для типов, которые не должны смешиваться с оригиналом. Это ловит ошибки на этапе компиляции, а не в рантайме.

Неочевидное влияние на RTTI и сериализацию

Ещё один нюанс, который редко учитывают новички: псевдонимы влияют на Run-Time Type Information (RTTI). Если вы объявили type TMyString = type string;, то в RTTI этот тип будет фигурировать как TMyString, а не как string. Это критично при работе с атрибутами, сериализацией JSON или рефлексией. Обратите внимание: при проверке через TypeInfo() вы получите указатель на RTTI именно псевдонима, а не базового типа. Профессиональный приём: если вы планируете сериализовать объекты, использующие псевдонимы, не полагайтесь на автоматическое сопоставление по имени — проверяйте RTTI явно.

Псевдонимы и перегрузка: подводные камни

Перегрузка процедур или функций с разными псевдонимами одного и того же базового типа — частый источник путаницы. Delphi не позволяет перегружать методы, отличающиеся только псевдонимом, если не указан строгий alias. Пример: procedure Foo(A: TMyInt); overload; и procedure Foo(A: TMyInt2); overload; — ошибка компиляции, если оба псевдонима нестрогие (type TMyInt = Integer). Решение: либо используйте строгие alias, либо добавляйте дополнительные параметры. Личный опыт: при рефакторинге проекта я потратил 3 часа на поиск причины, почему не вызывается ожидаемая перегрузка — забыл сменить type на type ... = type. Больше такой ошибки не повторял.

Оптимизация и выравнивание данных: что проверяют профилировщики

При работе с записями, содержащими поля-псевдонимы, специалисты по оптимизации смотрят на размер и выравнивание. Псевдоним не изменяет размер базового типа, но может повлиять на решение компилятора о выравнивании в упакованных записях. Подсказка: если вы используете packed record, псевдонимы не создают дополнительных отступов, но в обычной записи компилятор может выровнять поле-псевдоним так же, как и базовый тип. Это неочевидно при чтении кода, поэтому советую при сомнениях открывать вывод ассемблера (Ctrl+Alt+C) и смотреть на смещения.

Практический совет: когда alias — зло, а когда — необходимость

Я не рекомендую использовать псевдонимы для сокращения длинных имён типов — это ухудшает читаемость и запутывает код. Пример: type DBHandle = Integer; — плохо: вы не получаете никакой защиты от случайного смешивания с другими Integer-переменными. Вместо этого используйте строгий alias и лучше — класс-обёртку или record-хелпер. Применяйте псевдонимы только в двух сценариях: (1) абстрагирование от конкретной реализации (например, type TAppConfigID = type string;) и (2) обратная совместимость при переименовании типов. Всё остальное — повод задуматься, не пришло ли время для более серьёзного рефакторинга.

Что проверяют на code review

Опытные ревьюверы обращают внимание на три момента. Первое: не используется ли нестрогий alias там, где ожидается строгая типизация. Второе: не смешиваются ли разные псевдонимы в арифметических операциях (например, сложение TDistance и TSpeed — обе являются Integer). Третье: не забыт ли экспорт псевдонима в секции interface, если он используется в публичных методах. И последнее: при создании псевдонима для записи проверяют, не сломает ли это упаковку данных при передаче через DLL.

Итоговая рекомендация

Используйте псевдонимы осознанно. Помните: alias — не просто переименование, это инструмент контроля типов на уровне компилятора. Относитесь к нему как к полноценному типу данных, и вы избежите большинства проблем. Если сомневаетесь — предпочтите type ... = type ..., это дисциплинирует вас и ваш код.

Добавлено: 27.04.2026