🔓 Игнорирование internal для asmdef в Unity 🔓

🔓 Игнорирование internal для asmdef в Unity 🔓

Уровень материала: 🐥 #middle
Assembly Definitions — мощный инструмент для организации кода в Unity. Он предоставляет множество полезных возможностей и, в частности, позволяет пользоваться благами модификатора доступа internal. Но иногда бывает нужно internal "обходить" и получать доступ к закрытым ресурсам.

📌 Кратко про другие возможности Assembly Definitions:

  • Помогает разделить проект на модули и изолировать их друг от друга (UI, Gameplay, Data).
  • Помогает прозрачно контролировать зависимости между модулями.
  • Предотвращает появление циклических зависимостей, хотя бы на уровне модулей.
  • Ускоряет компиляцию скриптов, т.к. перекомпиляция происходит только для изменившихся и зависимых от них asmdef'ов.
  • Позволяет реализовывать платформозависимые модули (в т.ч. чисто Editor-модули).
  • Позволяет использовать Define Constraints на уровне целого модуля.
  • Позволяет реализовывать Define Symbols на основе версий Unity или используемых пакетов.

Про это более подробно написано в документации Unity.

🔒 Про internal:

Что делает internal: он делает доступ невозможным за пределами конкретного asmdef. Т.е. с internal можно взаимодействовать только в рамках одного модуля. Как private в рамках одного класса. Только уровнем выше.

Это помогает контролировать как Low Coupling, так и High Cohesion (см GRASP).

🚧 Преодоление internal:

Это неправильно с точки зрения проектирования, но есть, как минимум, два исключения. Это тесты и тулзы для редактора. Test и Editor – два модуля, которые вполне оправданно хотят трогать другие модули за все доступные и недоступные места. Но как это сделать?

Ответ: атрибут InternalsVisibleTo. Но как его использовать?

Это один из тех моментов, который плохо освещён в документации Unity. Но всё очень просто. Достаточно около asmdef'а создать файл AssemblyInfo.cs и поместить там атрибут InternalsVisibleTo с указанием имён asmdef'ов, для которых должен быть открыт доступ до internal методов и классов.

🔓 Игнорирование internal для asmdef в Unity 🔓
🔓 Игнорирование internal для asmdef в Unity 🔓

🔎 Поиск asmdef'ов:

Не все это знают, но в Unity внутри вкладки Project можно отфильтровать все Assembly Definition в проекте через промпт t: asmdef.

🔓 Игнорирование internal для asmdef в Unity 🔓
2
4 комментария