Чи повинні анотації методів життєвого циклу Unity за допомогою атрибута UsedImplicitly?


9

Чи UsedImplicitlyполіпшує анотування методів життєвого циклу Unity атрибут покращення читабельності вашого коду?

Наприклад:

public class Example : MonoBehaviour
{
    [UsedImplicitly]
    private void Awake()
    {
        DoSomething();
    }

    private void DoSomething()
    {
        // ...
    }
}

Ця публікація в блозі на тему "Структурування монобіотиків своєї єдності" пропонує такий підхід як корисну конвенцію.

  1. Анотуйте будь-які методи життєвого циклу Unity (Start, Awake, Update, OnDestroy тощо), методи подій та інші функції, які неявно (або автоматично) викликаються у вашому коді атрибутом [UsedImplicitly]. Цей атрибут, хоч і включений у UnityEngine.dll, використовується ReSharper для відключення пропозицій щодо очищення коду для методів, які, здавалося б, не мають відношення. Це також допомагає полегшити читання коду людям, які новіші для Unity та вашої бази коду, особливо для подій, на які посилається інспектор.

(Примітка. Я не думаю, що ReSharper не пропонує пропозицій щодо очищення коду для на перший погляд методів життєвого циклу Unity, так що це може бути застарілою порадою.)

Я погоджуюся з вищезгаданим повідомленням, що це може бути корисним для тих, хто новіший в Єдність. Я також думаю , що це може бути корисно для позначення тих функцій життєвого циклу Unity , які не використовуються так часто , як Awake, Startі Update. Але мені цікаво, чи це насправді хороша умова для «чистого коду», чи це просто шум, що знижує читабельність.


1
Я опублікував 2 ігри в Unity і не знав, що це існує. Якби я це зробив, я, мабуть, використовував би це для ясності і не вважав би це шумом.
МакАден

1
Гей, я оригінальний автор поста. Так, я думаю, що це може бути непосильним для методів життєвого циклу, особливо з огляду на покращену підтримку Resharper. Однак я думаю, що корисно коментувати зворотні виклики подій (наприклад, для анімації та системи подій UI), на які посилається лише інспектор. Хоча це залежать від людей, які керують базою кодів - коли я писав це, я працював у фірмі з консалтингу з програмного забезпечення, де ніхто не мав досвіду розробки ігор, тому я хотів встановити стандарт між нами. Це трохи драконічно в ретроспективі, оскільки я не очікував, що пост приверне увагу.
Мана

Відповіді:


10

Це залежить від цільової демографічної.

У наведеному вище прикладі цільовою демографічною групою є інструмент ReSharper, який користується цими атрибутами, оскільки він пригнічує повідомлення, які вам не корисні. Але якщо ви не відчуваєте необхідності використовувати ReSharper або подібний інструмент (хоча, можливо, вам слід, час від часу вони мають певну критичну критику), то вам не потрібно дбати про цю демографічну ситуацію.

Будь- , хто коли - небудь робив основний підручник Unity дуже добре знає , що Startі Updateвикористовуються неявно двигуном Unity, так що він не буде давати їм нову інформацію. Фактично це може збити з пантелику їх, якщо ви забудете це один раз. Що ти хочеш сказати з цим? Це, можливо, насправді не монобієр? Або є якась незрозуміла причина, чому ви повинні це чітко називати, про що я не знаю?

Однак це може допомогти, якщо ви працюєте з недосвідченими розробниками, які, можливо, не знайомі з більш езотеричними подіями Unity на кшталт Reset(небезпечно, тому що виклик його прямо не може робити те, що ви думаєте, що це робить). Потім [UsedImplicitly]атрибут може сказати їм, що їм не потрібно шукати клас, який викликає цей метод, тому що двигун робить. Але знову ж таки, це має значення лише в тому випадку, якщо ви маєте дисципліну робити це послідовно. І якщо у вас є така кількість самодисципліни, ви можете так само погодитися з додаванням коментаря.


1
Я додав би "для 99% демографічних показників це не приносить користі". Навіть початківці через кілька годин почнуть розпізнавати методи життєвого циклу (вони по-різному забарвлені у VS!). І повторна реалізація - це дорога ліцензія, яку можна переконфігурувати, і, як заявила ОП, вона, ймовірно, вже є виправленою. Я думаю, що можна витратити свій час ефективніше, ніж прикрашати кожен другий метод атрибутами, що сперечаються.
wondra

@wondra Дякуємо, що вказали, що у Visual Studio вони по-різному забарвлені. Я спробую розібратися, чому це не робить для мене з Visual Studio 2017, хоча Tools -> Options -> Tools for Unity -> General -> Unity Messages syntax highlightingце встановлено як істинне.
сонник

1
Я не розглядав, чому Visual Studio не забарвлює мої методи Unity, але в іншій відповіді було вказано, що ReSharper має плагін для Unity, який також автоматично розпізнає функції подій Unity. Існує також це пов'язано установка: ReSharper -> Options -> Code Inspection -> Settings -> Enable code analysis -> Color identifiers.
сонник

6

Я стверджую, що ніхто вам не повинен користуватися.

Атрибут UsedImplicitly - з простору імен Jetbrains.Annotations, тому єдиний випадок, коли він може застосовуватися, це якщо всі, хто використовує код, будуть використовувати ReSharper.

У ReSharper є плагін для Unity, який вже обробляє це для вас, переконуючись не просто видалити попередження про те, що вони не використовуються, але і позначає їх маленьким символом Unity, щоб кожен, хто читає код, бачив, що їх викликає Unity сам.

Я також хотів би додати приклад, коли їх використання може піти не так. Припустимо, у вас є клас, що успадковується від MonoBehaviour, але після рефактора він більше не має спадщини. Якщо ви позначили приватні методи за допомогою [UsedImplicitly], ви не отримаєте правильних попереджень. Якщо ви використовуєте плагін Unity для повторної готування, він помітить, що ви більше не успадковуєте MonoBehaviour, і викинете попередження, оскільки методи справді більше не викликаються.


1
Я не знав, що плагін ReSharper існує, дякую, що вказав на нього!
сонник

1
Зауважте, що Unity почав включати атрибути ReSharper в UnityEngine.dll станом на Unity 5 - дивіться цей пост на форумі .
сонник

5

Я б зробив аргумент, що це насправді не може зашкодити.

Для когось, дуже знайомого з роботою Unity, він, мабуть, нічого не додає. Ці люди вже будуть досить добре знайомі з тим, що час виконання Unity закликає від вашого імені.

Але для когось, хто не такий, як я, це може бути корисним. Навіть якби я не знав, що це означає напрочуд, я б пішов подивитися, і це, ймовірно, буде достатньо, щоб я краще зрозумів, що відбувається в коді.

Крім того, якщо ви користуєтеся інструментами статичного аналізу, які неправильно попереджають про методи, то вам потрібно хоч якось заспокоїти ці попередження, оскільки "невідомий" попереджувальний шум ускладнює бачення реальних попереджень у будь-якому такому виході. Зазвичай краще ігнорувати подібні застереження хірургічним, локалізованим способом (у цьому випадку шляхом прикраси методів образи атрибутами), ніж через більш широкі заходи, як відключення цього конкретного попереджувального проекту.


1
Дякую за вашу відповідь. Я думав аналогічно вашій відповіді, коли розміщував питання, але погоджуюся з іншими плакатами, які зазначають, що це може бути потенційно оманливим, якщо атрибут не буде використовуватися послідовно.
сонник

3
Так, це справедливі моменти. Якщо в когось є статичний аналіз, який займається цим, і ви ставитеся до цих попереджень серйозно, це допоможе вам забезпечити рівномірне застосування атрибуту. Але якщо ви цього не зробите? Це в значній мірі залежить від людської помилки.

2

Проблема такого підходу полягає в тому, що він неймовірно схильний до помилок.

Якщо вона не є надійною, теги не зможуть передати корисну інформацію, а їх наявність або відсутність час від часу вдасться передати неправдиву інформацію, що шкідливо.

Якщо ви вирішили піти з нею, ви повинні усунути помилку людини, що не важко зробити, але потрібні 2 години роботи, якщо ви ще цього не робили. Є два підходи - кожен з яких має свої переваги - ви можете використовувати будь-який:

  1. Перевірте та відхиліть невідповідний код під час реєстрації або автоматизованої збірки.
  2. Автоматизована редагування коду для виправлення тегів при реєстрації або автоматизованій збірці.

Чи варто це мати? Так. Чи варто 2 години вашого часу? Твій дзвінок.


1
Я прийняв іншу відповідь, але ви чудово відмічаєте питання про усунення помилки людини для тих, хто думає про використання UsedImplicitlyатрибуту для цієї мети.
сонник
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.