¿Deberían anotarse los métodos del ciclo de vida de Unity con el atributo UsedImplicitly?

9

¿Anotar los métodos del ciclo de vida de Unity con el UsedImplicitlyatributo mejora la legibilidad de su código?

Por ejemplo:

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

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

Esta publicación de blog sobre "Estructurando su unidad de monocomportamientos" sugiere este enfoque como una convención útil.

  1. Anote cualquier método de ciclo de vida de Unity (Inicio, Despertar, Actualizar, OnDestroy, etc.), métodos de eventos y otras funciones que se invoquen implícita (o automáticamente) en su código con el atributo [UsedImplicitly]. ReSharper utiliza este atributo, aunque está incluido en UnityEngine.dll, para deshabilitar las sugerencias de limpieza de código para métodos que aparentemente no tienen referencia. También ayuda a que el código sea más fácil de leer para las personas que son más nuevas en Unity y su base de código, especialmente para los eventos a los que se hace referencia a través del inspector.

(Nota: no creo que ReSharper muestre sugerencias de limpieza de código para métodos de ciclo de vida de Unity aparentemente sin referencia, por lo que podría ser un consejo desactualizado).

Estoy de acuerdo con la publicación anterior de que podría ser útil para los más nuevos en Unity. También creo que podría ser útil para etiquetar las funciones del ciclo de vida de la unidad de que no se utilizan con tanta frecuencia como Awake, Start, y Update. Pero me pregunto si esta es realmente una buena convención para el "código limpio", o si es solo el ruido lo que reduce la legibilidad.

hijo
fuente
1
He publicado 2 juegos en Unity y no sabía que esto existía. Si lo hubiera hecho, probablemente lo habría usado por claridad y no lo consideraría ruido.
McAden
1
Hola, soy el autor original de la publicación. Sí, creo que puede ser excesivo para los métodos de ciclo de vida, especialmente dado el soporte mejorado de Resharper. Sin embargo, creo que es útil anotar las devoluciones de llamadas de eventos (por ejemplo, para animaciones y el sistema de eventos de UI de Unity) a los que solo se hace referencia a través del inspector. Sin embargo, depende de las personas que administran la base de código: cuando escribí esto, estaba trabajando en una empresa de consultoría de software donde nadie tenía experiencia en desarrollo de juegos, por lo que quería establecer un estándar entre nosotros. Es un poco draconiano en retrospectiva, ya que no esperaba que la publicación llamara la atención.
Mana

Respuestas:

10

Depende del objetivo demográfico.

En el ejemplo anterior, el objetivo demográfico es la herramienta ReSharper, que se beneficia de estos atributos porque suprime los mensajes que no son útiles para usted. Pero si no siente la necesidad de usar ReSharper o una herramienta similar (aunque tal vez debería hacerlo, tienen alguna crítica válida de vez en cuando), entonces no necesita preocuparse por esa demografía.

Cualquiera que haya hecho un tutorial básico de Unity sabe muy bien que Start y Updateel motor de Unity lo utiliza implícitamente, por lo que no les dará ninguna información nueva. De hecho, podría confundirlos si se olvida esto una vez. ¿Qué quieres decir con eso? ¿Es esto quizás no realmente un MonoBehaviour? ¿O hay alguna razón oscura por la que debes llamarla explícitamente de la que no estoy al tanto?

Sin embargo, puede ayudar si está trabajando con desarrolladores inexpertos que podrían no estar familiarizados con los eventos de Unity más esotéricos como Reset(peligroso, porque llamarlo explícitamente podría no hacer lo que cree que hace). El [UsedImplicitly]atributo podría decirles que no necesitan buscar la clase que llama a ese método porque el motor sí. Pero, de nuevo, esto solo tiene valor si tiene la disciplina para hacerlo de manera consistente. Y si tiene esa cantidad de autodisciplina, podría estar de acuerdo en agregar un comentario.

Philipp
fuente
1
Yo agregaría un "para el 99% demográfico no proporciona ningún beneficio". Incluso los principiantes después de unas pocas horas comenzarán a reconocer los métodos del ciclo de vida (¡están coloreados de manera diferente en VS!). Y resharper es: una licencia costosa, puede reconfigurarse y, como OP dijo, probablemente ya esté parcheada de todos modos. Creo que uno puede pasar su tiempo de manera más efectiva que decorar cada segundo método con atributos de valor discutible.
wondra
@wondra Gracias por señalar que tienen colores diferentes en Visual Studio. Trataré de descubrir por qué no me hace eso con Visual Studio 2017, aunque Tools -> Options -> Tools for Unity -> General -> Unity Messages syntax highlightingesté configurado como verdadero.
sonny
1
No analicé por qué Visual Studio no estaba coloreando mis métodos de Unity, pero otra respuesta señaló que ReSharper tiene un complemento para Unity que también reconoce automáticamente las funciones de eventos de Unity. También existe esta configuración relacionada: ReSharper -> Options -> Code Inspection -> Settings -> Enable code analysis -> Color identifiers.
sonny
6

Sostengo que no, no deberías usarlo.

El atributo UsedImplicitly es del espacio de nombres Jetbrains.Annotations, por lo que el único caso en el que podría aplicarse es si todos los que usan el código usarán ReSharper.

ReSharper tiene un complemento para Unity que ya maneja esto por usted, asegurándose no solo de eliminar las advertencias de que no se usan, sino que también los marca con un pequeño símbolo de Unity para que cualquiera que lea el código pueda ver que Unity los llamó.

También me gustaría agregar un ejemplo cuando usarlos podría salir mal. Suponga que tiene una clase que hereda de MonoBehaviour, pero después de un refactorizador ya no tiene ninguna herencia. Si marcó métodos privados con [UsedImplicitly], no recibirá las advertencias correctas. Si usa el complemento Unity para reorganizador, notará que ya no hereda de MonoBehaviour y lanzará advertencias ya que los métodos ya no se llaman.

Mikael Högström
fuente
1
No sabía que existía el complemento ReSharper, ¡gracias por señalarlo!
sonny
1
Tenga en cuenta que Unity ha comenzado a incluir los atributos ReSharper en UnityEngine.dll a partir de Unity 5; consulte esta publicación del foro .
sonny
5

Argumentaría que realmente no puede doler.

Para alguien muy familiarizado con el funcionamiento de Unity, probablemente no agrega nada. Esas personas ya van a estar bastante familiarizadas con lo que el tiempo de ejecución de Unity llama en su nombre.

Pero para alguien que no es, como yo, podría ser útil. Incluso si no supiera lo que significaba de improviso, iría a buscarlo, y eso probablemente sería suficiente para comprender mejor lo que estaba sucediendo en el código.

Además, si uno usa herramientas de análisis estático que advierten incorrectamente sobre los métodos, entonces querrá silenciar esas advertencias de alguna manera, porque el ruido de advertencia "ignorable" hace que sea más difícil ver las advertencias reales en cualquier salida de este tipo. Por lo general, es mejor ignorar tales advertencias de manera quirúrgica y localizada (en este caso decorando los métodos ofensivos con atributos) que a través de medidas más amplias como deshabilitar esa advertencia específica en todo el proyecto.


fuente
1
Gracias por tu respuesta. Estaba pensando de manera similar a su respuesta cuando publiqué la pregunta, pero estoy de acuerdo con otros carteles que señalan que podría ser potencialmente engañoso si el atributo no se usa de manera consistente.
sonny
3
Sí, esos son puntos justos. Si uno qué tienen análisis estático que tropieza con esto, y uno trata a esas advertencias en serio, que pueden ayudar a asegurar el atributo se aplica de manera uniforme. Pero si no lo haces? Entonces depende del error humano.
2

El problema con este enfoque es que es increíblemente propenso a errores.

Si no es confiable, las etiquetas no transmitirán información útil, y su presencia o ausencia ocasionalmente logrará transmitir información falsa, lo cual es dañino.

Si decide seguirlo, debe eliminar el error humano, que no es difícil de hacer, pero lleva unas buenas 2 horas de trabajo si no ha hecho algo como esto antes. Hay 2 enfoques, cada uno con sus propias ventajas, puede usar cualquiera de ellos:

  1. Verifique y rechace el código que no cumple al registrarse o la compilación automatizada.
  2. Edición automatizada de código para corregir etiquetas en el check-in o compilación automática.

¿Vale la pena tenerlo? Si. ¿Vale la pena 2 horas de tu tiempo? Tu llamada.

Peter
fuente
1
He aceptado una respuesta diferente, pero usted hace un gran comentario acerca de eliminar el error humano para cualquiera que esté pensando en usar el UsedImplicitlyatributo para este propósito.
sonny