Почему AT - обоюдоострый меч

Почему AT - обоюдоострый меч

Версия(и) Minecraft
Любая с Forge и поддержкой AT
Данная тема призвана рассмотреть ряд нюансов и подводных камней, связанных с применением такой удобной фичи Forge, как Access Transformers. В процессе я буду сравнивать их с главной альтернативой - accessor-миксинами, которые предоставляют схожие возможности расширения доступности полей/методов.

Соответственно, чтобы понимать о чём речь, вам нужно:
  1. Знать что такое AT и как с ними работать;
  2. Знать что такое миксины и как с ними работать.
С технологией трансформеров вас может ознакомить вот эта тема, касаемо accessor-миксинов - рекомендовал бы почитать оригинальный англоязычный javadoc.

Вступление
Если прочитав название темы ваш разум посетила мысль формата "всмысле обоюдоострый?" или "это какие такие нюансы лол", сам этот факт служит демонстрацией основной проблемы AT. Они не выглядят плохим или опасным решением поверхности, но как и многие средства кормоддинга - они являются опасными, и обращаться с ними нужно с надлежащей осторожностью. Проблема в том, что не существует абсолютно никаких толчков использовать их с осторожностью, и они часто применяются бездумно, с минимальным уделением внимания тому, как это повлияет на более тонкие контракты поведения.

Сравнение
Разница между "сделать приватное поле публичным" и "вставить метод который позволяет взаимодействовать с полем, не меняя само поле" может показаться сугубо семантической на поверхности; но давайте посмотрим на разницу, если принять во внимание ситуацию, в которой несколько модов вносят по несколько изменений в класс:

1) Очевидно ли, какой мод изменил видимость поля/метода, или что оно вообще было private/protected без проверки оригинального класса?
- Access Transformers: ❌
- Accessor-миксин: ✅


2) Можно ли легко найти места вызова, чтобы понять, для чего поле/метод вообще были сделаны публичными, или вставить брейкпоинт во внедрённый акцессор в целях дебага?
- Access Transformers: ❌
- Accessor-миксин: ✅


3) Могут ли другие трансформеры всё ещё обращаться с полем/методом как с приватными, и безопасно модифицировать это поле/метод в пределах класса, зная, что они не были изменены нигде более?
- Access Transformers: ❌
- Accessor-миксин: ✅
Примечание: Если бы Access Transformers каким-то образом аннотировали изменённые поля, это бы немного помогло. Но вносимые ими изменения всё ещё фундаментально меняют контракт класса.

4) Можно ли сделать protected-методы доступными безопасно, не рискуя налететь на исключение из-за того, что некий субкласс оверрайдит этот самый метод и оставляет видимость на уровне protected?
- Access Transformers: ❌
- Accessor-миксин: ✅

5) Есть ли способ выразить намерение, стоящее за изменением доступности поля - например, только чтобы считывать его значение, но не изменять?
- Access Transformers: ❌
- Accessor-миксин: ✅ - внедряем только геттер

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

Заключение
Кормоддинг не обязательно должен быть чёрной и злой магией. В идеальном мире, где все применяющие инструменты кормоддинга разработчики обращаются с ними бережно и осмотрительно - проблем с ними потом ни у кого не возникает. Но как можно догадаться, мы живём не в идеальном мире, и нескольких строк небрежно написанного кода зачастую достаточно, чтобы заставить многих страдать.
Конечно, тут многое зависит от направленности ваших разработок - если вы делаете приватные моды под один или ограниченное число проектов, все вышеописанные аргументы редко будут применимы на практике, да и в случае потенциальных неполадок страдать, скорее всего, придётся только вам самим. Но если ваш выбор - публичные разработки и опенсорс, особенно на последних версиях Minecraft, то уж тут мы не работаем в пространстве, где один мод может внести абсолютно любые желаемые изменения. Люди хотят иметь десятки модов в одной сборке, и чтобы все они при этом или работали, или хотя бы чтобы при поломке чего-то было понятно, что именно конфликтует. Поэтому стоит обратить внимание на эти нюансы, и по крайней мере иметь их ввиду.
Автор
Aizistral
Просмотры
229
Первый выпуск
Обновление
Оценка
2.00 звёзд 1 оценок

Последние рецензии

Рассмотрена ситуация однобоко. Ни слова про плюсы АТ
Aizistral
Aizistral
Ну, не просто же так тема называется "Почему AT - обоюдоострый меч". Я согласен что у AT есть свои плюсы, но здесь фокус изначально не был на том, чтобы показать их. Сравнение с Mixin'ом приводится только как способ подчеркнуть перечисленные недостатки, приведя в пример альтернативное решение, которое их не имеет.
Сверху