Czy metody cyklu życia Unity powinny być opatrzone adnotacjami za pomocą atrybutu UsedImplicitly?


9

Czy opisywanie metod cyklu życia Unity UsedImplicitlyatrybutem poprawia czytelność kodu?

Na przykład:

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

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

Ten post na blogu „Strukturyzowanie Twojej jedności MonoBehaviours” sugeruje takie podejście jako przydatną konwencję.

  1. Adnotuj wszelkie metody cyklu życia Unity (Start, Awake, Update, OnDestroy itp.), Metody zdarzeń i inne funkcje, które są domyślnie (lub automatycznie) wywoływane w kodzie za pomocą atrybutu [UsedImplicitly]. Ten atrybut, mimo że jest zawarty w UnityEngine.dll, jest wykorzystywany przez ReSharper do wyłączania sugestii dotyczących czyszczenia kodu dla metod, które są pozornie niepowiązane. Pomaga także ułatwić odczytanie kodu osobom, które są nowsze w Unity i twojej bazie kodu, szczególnie w przypadku zdarzeń, do których odwołuje się inspektor.

(Uwaga: nie sądzę, aby ReSharper wyświetlał sugestie dotyczące czyszczenia kodu dla pozornie niepowiązanych metod cyklu życia Unity, więc mogą to być nieaktualne porady.)

Zgadzam się z powyższym postem, że może być pomocny dla osób nowszych w Unity. Myślę też może być przydatna do oznaczania tych funkcji Unity cyklu życia , które nie są używane tak często, jak Awake, Starti Update. Zastanawiam się jednak, czy tak naprawdę jest to dobra konwencja dla „czystego kodu”, czy tylko szum ogranicza czytelność.


1
Opublikowałem 2 gry w Unity i nie wiedziałem, że to istnieje. Gdybym to zrobił, prawdopodobnie użyłbym tego dla jasności i nie uznałbym tego za hałas.
McAden,

1
Hej, jestem oryginalnym autorem postu. Tak, myślę, że może to być przesada w metodach cyklu życia, szczególnie biorąc pod uwagę ulepszoną obsługę Resharpera. Uważam jednak, że przydatne jest dodawanie adnotacji do wywołań zwrotnych zdarzeń (np. W przypadku animacji i systemu zdarzeń interfejsu użytkownika Unity), do których odwołuje się tylko inspektor. To zależy od ludzi zarządzających bazą kodu - kiedy to napisałem, pracowałem w firmie konsultingowej, w której nikt nie miał doświadczenia w tworzeniu gier, więc chciałem ustalić między nami standard. Z perspektywy czasu jest to nieco drakońskie, ponieważ nie spodziewałem się, że post zwróci uwagę.
Mana

Odpowiedzi:


10

To zależy od docelowej grupy demograficznej.

W powyższym przykładzie docelową grupą demograficzną jest narzędzie ReSharper, które korzysta z tych atrybutów, ponieważ tłumi wiadomości, które nie są dla ciebie pomocne. Ale jeśli nie czujesz potrzeby używania ReSharpera lub podobnego narzędzia (chociaż może powinieneś mieć od czasu do czasu jakąś ważną krytykę), to nie musisz przejmować się tą demografią.

Każdy, kto kiedykolwiek wykonał podstawowy samouczek Unity, wie o tym bardzo dobrze Starti Updatejest niejawnie wykorzystywany przez silnik Unity, więc nie dostarczy żadnych nowych informacji. To może dezorientować ich, jeśli raz o tym zapomnisz. Co chcesz z tym powiedzieć? Czy to może tak naprawdę nie jest MonoBehaviour? A może jest jakiś niejasny powód, dla którego musisz nazwać to jawnie, czego nie jestem świadomy?

Może to jednak pomóc, jeśli pracujesz z niedoświadczonymi programistami, którzy mogą nie być zaznajomieni z bardziej ezoterycznymi zdarzeniami Unity, takimi jak Reset(niebezpieczne, ponieważ jawne wywołanie tego może nie zrobić tego, co myślisz). [UsedImplicitly]Atrybut może potem powiedzieć im, że nie muszą szukać dla klasy, która wywołuje tę metodę, ponieważ silnik ma. Ale znowu, ma to wartość tylko wtedy, gdy masz dyscyplinę, aby robić to konsekwentnie. A jeśli masz taką samodyscyplinę, równie dobrze możesz zgodzić się na dodanie komentarza.


1
Dodałbym „dla 99% grupy demograficznej nie przynosi żadnych korzyści”. Nawet początkujący po kilku godzinach zaczną rozpoznawać metody cyklu życia (w VS mają inny kolor!). A resharper to: kosztowna licencja, którą można zmienić, a jak powiedział OP, prawdopodobnie i tak jest już załatana. Myślę, że można spędzać czas bardziej efektywnie niż dekorowanie co drugiej metody atrybutami o spornej wartości.
wondra,

@wondra Dziękujemy za zwrócenie uwagi, że w programie Visual Studio są one inaczej zabarwione. Spróbuję dowiedzieć się, dlaczego nie robi to dla mnie w Visual Studio 2017, mimo że Tools -> Options -> Tools for Unity -> General -> Unity Messages syntax highlightingjest ustawiony na prawdę.
sonny,

1
Nie zastanawiałem się, dlaczego Visual Studio nie koloruje moich metod Unity, ale inna odpowiedź wskazała, że ​​ReSharper ma wtyczkę do Unity, która również automatycznie rozpoznaje funkcje zdarzeń Unity. Jest to związane również ustawienie: ReSharper -> Options -> Code Inspection -> Settings -> Enable code analysis -> Color identifiers.
sonny,

6

Twierdzę, że nie, nie powinieneś go używać.

Atrybut UsedImplicitly pochodzi z przestrzeni nazw Jetbrain. Adnotacje, więc jedynym przypadkiem, w którym może być zastosowany, jest to, że wszyscy używający kodu będą używać ReSharper.

ReSharper ma wtyczkę do Unity, która już to obsługuje, upewniając się, że nie tylko usuwa ostrzeżenia, że ​​nie są one używane, ale także zaznacza je małym symbolem Unity, aby każdy, kto czyta kod, mógł zobaczyć, że są wywoływani przez samą Unity.

Chciałbym również dodać przykład, gdy ich użycie może się nie powieść. Załóżmy, że masz klasę dziedziczącą po MonoBehaviour, ale po refaktorze nie ma już żadnego dziedzictwa. Jeśli oznaczysz metody prywatne za pomocą [Używane niejawnie], nie otrzymasz poprawnych ostrzeżeń. Jeśli użyjesz wtyczki Unity do resharpera, zauważysz, że nie dziedziczysz już od MonoBehaviour i rzuci ostrzeżenia, ponieważ metody rzeczywiście nie są już wywoływane.


1
Nie wiedziałem, że istnieje wtyczka ReSharper, dzięki za wskazanie jej!
sonny,

1
Zauważ, że Unity zaczął włączać atrybuty ReSharper do UnityEngine.dll od Unity 5 - zobacz ten post na forum .
sonny,

5

Argumentowałbym, że tak naprawdę nie może boleć.

Dla kogoś bardzo obeznanego z działaniami Unity prawdopodobnie nic nie dodaje. Ci ludzie już będą bardzo dobrze zaznajomieni z tym, co środowisko wykonawcze Unity wywołuje w twoim imieniu.

Ale dla kogoś, kto nie jest taki jak ja, może być pomocny. Nawet gdybym nie wiedział, co to znaczy odręcznie, sprawdziłbym to, a to prawdopodobnie wystarczałoby, aby lepiej zrozumieć, co się dzieje w kodzie.

Ponadto, jeśli ktoś użyje narzędzi do analizy statycznej, które niepoprawnie ostrzegają o metodach, to należy w jakiś sposób wyciszyć te ostrzeżenia, ponieważ „ignorowalny” hałas ostrzegawczy utrudnia dostrzeżenie prawdziwych ostrzeżeń w takich danych wyjściowych. Zazwyczaj lepiej jest zignorować takie ostrzeżenia w sposób chirurgiczny, zlokalizowany (w tym przypadku poprzez dekorowanie szkodliwych metod atrybutami) niż za pomocą szerszych środków, takich jak wyłączenie tego konkretnego ostrzeżenia dla całego projektu.


1
Dzięki za odpowiedź. Kiedy zamieściłem pytanie, myślałem podobnie do twojej odpowiedzi, ale zgadzam się z innymi plakatami, którzy wskazują, że może to być potencjalnie mylące, jeśli atrybut nie będzie konsekwentnie stosowany.
sonny,

3
Tak, to są słuszne argumenty. Jeśli ktoś nie ma analizy statycznej, że wyjazdy nad tym i jeden traktuje te ostrzeżenia poważnie, które mogą pomóc zapewnić atrybut jest stosowany jednolicie. Ale jeśli nie? To w zasadzie zależy od błędu ludzkiego.

2

Problem z tym podejściem polega na tym, że jest niezwykle podatny na błędy.

Jeśli nie będzie wiarygodny, tagi nie przekażą użytecznych informacji, a ich obecność lub nieobecność będzie czasem udawana, że ​​będą przekazywać fałszywe informacje, co jest szkodliwe.

Jeśli zdecydujesz się na to, musisz usunąć ludzki błąd, co nie jest trudne, ale zajmuje dobre 2 godziny pracy, jeśli wcześniej nie zrobiłeś czegoś takiego. Istnieją 2 podejścia - każde z nich ma swoje zalety - możesz użyć jednego z nich:

  1. Weryfikuj i odrzucaj niezgodny kod podczas odprawy lub kompilacji automatycznej.
  2. Zautomatyzowana edycja kodu w celu naprawy tagów przy zameldowaniu lub automatycznej kompilacji.

Czy warto to mieć? Tak. Czy warto 2 godziny twojego czasu? Twoja decyzja.


1
Zaakceptowałem inną odpowiedź, ale świetnie nadajesz się do usuwania błędu ludzkiego dla każdego, kto myśli o użyciu UsedImplicitlyatrybutu do tego celu.
sonny,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.