UsedImplicitly
Verbessert das Annotieren von Unity-Lebenszyklusmethoden mit dem Attribut die Lesbarkeit Ihres Codes?
Zum Beispiel:
public class Example : MonoBehaviour
{
[UsedImplicitly]
private void Awake()
{
DoSomething();
}
private void DoSomething()
{
// ...
}
}
Dieser Blog-Beitrag über "Strukturieren Ihrer Einheit MonoBehaviours" schlägt diesen Ansatz als nützliche Konvention vor.
- Kommentieren Sie alle Unity-Lebenszyklusmethoden (Start, Awake, Update, OnDestroy usw.), Ereignismethoden und andere Funktionen, die implizit (oder automatisch) in Ihrem Code aufgerufen werden, mit dem Attribut [UsedImplicitly]. Obwohl dieses Attribut in der UnityEngine.dll enthalten ist, wird es von ReSharper verwendet, um Vorschläge zur Codebereinigung für Methoden zu deaktivieren, auf die scheinbar nicht verwiesen wird. Dies erleichtert auch das Lesen des Codes für Personen, die mit Unity und Ihrer Codebasis noch nicht vertraut sind, insbesondere für Ereignisse, auf die über den Inspektor verwiesen wird.
(Hinweis: Ich glaube nicht, dass ReSharper Vorschläge zur Codebereinigung für scheinbar nicht referenzierte Unity-Lebenszyklusmethoden anzeigt, sodass dies möglicherweise veraltete Ratschläge sind.)
Ich stimme dem obigen Beitrag zu, dass er für diejenigen hilfreich sein könnte, die neu in Unity sind. Ich denke auch , es könnte nützlich sein , diese zu beschriften Unity Lifecycle - Funktionen , die nicht so häufig verwendet werden , wie Awake
, Start
und Update
. Aber ich frage mich, ob dies tatsächlich eine gute Konvention für "sauberen Code" ist oder ob nur Rauschen die Lesbarkeit beeinträchtigt.
Antworten:
Dies hängt von der Zielgruppe ab.
Im obigen Beispiel ist die Zielgruppe das ReSharper-Tool, das von diesen Attributen profitiert, da es Nachrichten unterdrückt, die für Sie nicht hilfreich sind. Wenn Sie jedoch nicht das Bedürfnis haben, ReSharper oder ein ähnliches Tool zu verwenden (obwohl Sie es vielleicht sollten, haben sie von Zeit zu Zeit eine gültige Kritik), müssen Sie sich nicht um diese demografische Gruppe kümmern.
Jeder, der jemals ein grundlegendes Unity-Tutorial erstellt hat, weiß das sehr gut
Start
undUpdate
wird implizit von der Unity-Engine verwendet, sodass er keine neuen Informationen erhält. Es könnte in der Tat die Hölle verwirren, wenn Sie dies einmal vergessen. Was willst du damit sagen? Ist das vielleicht nicht wirklich ein MonoBehaviour? Oder gibt es einen obskuren Grund, warum Sie es explizit nennen müssen, den ich nicht kenne?Es kann jedoch hilfreich sein, wenn Sie mit unerfahrenen Entwicklern zusammenarbeiten, die möglicherweise nicht mit den eher esoterischen Unity-Ereignissen vertraut sind
Reset
(gefährlich, da ein expliziter Aufruf möglicherweise nicht das tut, was Sie denken). Das[UsedImplicitly]
Attribut sagt ihnen dann möglicherweise, dass sie nicht nach der Klasse suchen müssen, die diese Methode aufruft, weil die Engine dies tut. Aber auch dies ist nur dann von Wert, wenn Sie die Disziplin haben, dies konsequent zu tun. Und wenn Sie so viel Selbstdisziplin haben, können Sie sich genauso gut darauf einigen, einen Kommentar hinzuzufügen.quelle
Tools -> Options -> Tools for Unity -> General -> Unity Messages syntax highlighting
es auf true gesetzt ist.ReSharper -> Options -> Code Inspection -> Settings -> Enable code analysis -> Color identifiers
.Ich behaupte, nein, du solltest es nicht benutzen.
Das UsedImplicitly-Attribut stammt aus dem Jetbrains.Annotations-Namespace. Der einzige Fall, in dem es möglicherweise angewendet wird, ist, wenn jeder, der den Code verwendet, ReSharper verwendet.
ReSharper hat ein Plugin für Unity, das dies bereits für Sie erledigt. Achten Sie darauf, dass Sie nicht nur Warnungen entfernen, die nicht verwendet werden, sondern sie auch mit einem kleinen Unity-Symbol kennzeichnen, damit jeder, der den Code liest, sehen kann, dass sie von Unity selbst aufgerufen werden.
Ich möchte auch ein Beispiel hinzufügen, wenn die Verwendung möglicherweise schief geht. Angenommen, Sie haben eine Klasse, die von MonoBehaviour erbt, aber nach einem Refactor hat sie keine Vererbung mehr. Wenn Sie private Methoden mit [UsedImplicitly] markiert haben, erhalten Sie nicht die richtigen Warnungen. Wenn Sie das Unity-Plugin zum erneuten Schärfen verwenden, wird festgestellt, dass Sie nicht mehr von MonoBehaviour erben, und es werden Warnungen ausgegeben, da die Methoden tatsächlich nicht mehr aufgerufen werden.
quelle
Ich würde argumentieren, dass es nicht wirklich weh tun kann.
Für jemanden, der mit der Arbeitsweise von Unity sehr vertraut ist, fügt es wahrscheinlich nichts hinzu. Diese Leute werden bereits ziemlich vertraut damit sein, was die Laufzeit von Unity in Ihrem Namen erfordert.
Aber für jemanden, der nicht so ist wie ich, könnte es hilfreich sein. Selbst wenn ich nicht sofort wüsste, was es bedeutet, würde ich es nachschlagen, und das würde wahrscheinlich ausreichen, um mir ein besseres Verständnis dafür zu geben, was im Code vor sich geht.
Wenn man statische Analysewerkzeuge verwendet, die fälschlicherweise vor den Methoden warnen, sollten Sie diese Warnungen irgendwie beruhigen, da "ignorierbares" Warngeräusch es schwieriger macht, die tatsächlichen Warnungen in einer solchen Ausgabe zu sehen. In der Regel ist es besser, solche Warnungen auf chirurgische, lokalisierte Weise zu ignorieren (in diesem Fall durch Verzieren der fehlerhaften Methoden mit Attributen), als durch umfassendere Maßnahmen wie das Deaktivieren dieser spezifischen Warnung im gesamten Projekt.
quelle
Das Problem bei diesem Ansatz ist, dass er unglaublich fehleranfällig ist.
Wenn dies nicht zuverlässig ist, können die Tags keine nützlichen Informationen übermitteln, und ihre Anwesenheit oder Abwesenheit kann gelegentlich falsche Informationen übermitteln, was schädlich ist.
Wenn Sie sich dafür entscheiden, müssen Sie den menschlichen Fehler beseitigen, was nicht schwer zu tun ist, aber gut 2 Stunden Arbeit kostet, wenn Sie so etwas noch nicht getan haben. Es gibt zwei Ansätze - jeder mit seinen eigenen Vorteilen - Sie können einen verwenden:
Lohnt es sich, es zu haben? Ja. Lohnt es sich 2 Stunden Ihrer Zeit? Ihr Anruf.
quelle
UsedImplicitly
Attribut für diesen Zweck zu verwenden.