Помогает ли аннотирование методов жизненного цикла Unity с помощью UsedImplicitly
атрибута улучшить читабельность вашего кода?
Например:
public class Example : MonoBehaviour
{
[UsedImplicitly]
private void Awake()
{
DoSomething();
}
private void DoSomething()
{
// ...
}
}
Этот пост в блоге "Структурирование вашего единства MonoBehaviours" предлагает этот подход в качестве полезного соглашения.
- Аннотируйте все методы жизненного цикла Unity (Start, Awake, Update, OnDestroy и т. Д.), Методы событий и другие функции, которые неявно (или автоматически) вызываются в вашем коде с атрибутом [UsedImplicitly]. Этот атрибут, хотя и включен в UnityEngine.dll, используется ReSharper для отключения предложений по очистке кода для методов, которые, по-видимому, не ссылаются. Это также помогает упростить чтение кода для людей, которые являются новичками в Unity и вашей кодовой базе, особенно для событий, на которые ссылается инспектор.
(Примечание: я не думаю, что ReSharper предлагает рекомендации по очистке кода для, казалось бы, не связанных методов жизненного цикла Unity, так что это может быть устаревшим советом.)
Я согласен с приведенным выше постом, что он может быть полезен для новичков в Unity. Я также думаю, что было бы полезно пометить те функции жизненного цикла Unity , которые используются не так часто, какAwake
, Start
и Update
. Но мне интересно, действительно ли это хорошее соглашение для «чистого кода» или это просто шум, который снижает читабельность.
Ответы:
Это зависит от целевой аудитории.
В приведенном выше примере целевой демографией является инструмент ReSharper, который использует эти атрибуты, потому что он подавляет сообщения, которые вам не нужны. Но если вы не чувствуете необходимости использовать ReSharper или подобный инструмент (хотя, возможно, вам следует, у них время от времени есть некоторая достоверная критика), тогда вам не нужно заботиться об этой демографии.
Любой, кто когда-либо читал базовый учебник по Unity, прекрасно это знает
Start
иUpdate
неявно используется движком Unity, поэтому он не даст им никакой новой информации. Это может на самом деле запутать их, если вы забудете об этом однажды. Что ты хочешь сказать этим? Может быть, это на самом деле не MonoBehaviour? Или есть какая-то неясная причина, почему вы должны назвать это явно, о которой я не знаю?Это может, однако, помочь, если вы работаете с неопытными разработчиками, которые могут быть не знакомы с более эзотерическими событиями Unity, такими как
Reset
(опасно, потому что явный вызов этого может сделать не так, как вы думаете).[UsedImplicitly]
Атрибут мог бы тогда сказать им , что они не должны искать класс , который вызывает этот метод , потому что двигатель делает. Но опять же, это имеет значение, только если у вас есть дисциплина, чтобы делать это последовательно. И если у вас есть такое количество самодисциплины, вы могли бы также согласиться на добавление комментария.источник
Tools -> Options -> Tools for Unity -> General -> Unity Messages syntax highlighting
него установлено значение true.ReSharper -> Options -> Code Inspection -> Settings -> Enable code analysis -> Color identifiers
.Я утверждаю, что нет, вы не должны его использовать.
Атрибут UsedImplicitly взят из пространства имен Jetbrains.Annotations, поэтому он может применяться только в том случае, если все, кто использует код, будут использовать ReSharper.
ReSharper имеет плагин для Unity который уже обрабатывает это для вас, обеспечивая не только удаление предупреждений о том, что они не используются, но также помечая их небольшим символом Unity, чтобы любой читающий код мог видеть, что они вызваны самим Unity.
Я также хотел бы добавить пример, когда их использование может пойти не так. Предположим, у вас есть класс, унаследованный от MonoBehaviour, но после рефакторинга он больше не наследуется. Если вы пометили закрытые методы с помощью [UsedImplicitly], вы не получите правильных предупреждений. Если вы используете плагин Unity для resharper, он заметит, что вы больше не наследуете от MonoBehaviour, и выдаст предупреждения, так как методы больше не вызываются.
источник
Я бы сделал аргумент, что это не может повредить.
Для кого-то, очень знакомого с работой Unity, это, вероятно, ничего не добавляет. Эти люди уже будут хорошо знакомы с тем, что среда выполнения Unity призывает от вашего имени.
Но для кого-то, кто не такой, как я, это может быть полезно. Даже если бы я не знал, что это означает, не обращая внимания, я бы посмотрел его, и этого, вероятно, было бы достаточно, чтобы дать мне лучшее понимание того, что происходит в коде.
Кроме того, если кто-то использует инструменты статического анализа, которые неправильно предупреждают о методах, тогда вы захотите как-то скрыть эти предупреждения, потому что «игнорируемый» предупреждающий шум затрудняет просмотр реальных предупреждений в любом таком выводе. Обычно лучше игнорировать такие предупреждения хирургическим, локализованным способом (в данном случае путем украшения нарушающих методов атрибутами), чем с помощью более широких мер, таких как отключение этого конкретного предупреждения в рамках всего проекта.
источник
Проблема этого подхода в том, что он невероятно подвержен ошибкам.
Если это ненадежно, теги не смогут передать полезную информацию, а их наличие или отсутствие иногда может привести к передаче ложной информации, что является вредным.
Если вы решите пойти с этим, вы должны устранить человеческую ошибку, которая не является трудной, но требует 2 часов хорошей работы, если вы не сделали что-то подобное раньше. Есть 2 подхода - каждый со своими преимуществами - вы можете использовать любой из них:
Стоит ли это иметь? Да. Это стоит 2 часа вашего времени? Ваш звонок.
источник
UsedImplicitly
атрибута для этой цели.