Unity yaşam döngüsü yöntemleri UsedImplicitly özniteliğiyle açıklanmalıdır mı?


9

UsedImplicitlyÖznitelik ile Unity yaşam döngüsü yöntemlerine açıklama eklemek kodunuzun okunabilirliğini artırır mı?

Örneğin:

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

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

"Birlik MonoBehaviourlarınızı Yapılandırma" konulu bu blog yazısı, bu yaklaşımı faydalı bir sözleşme olarak önermektedir.

  1. [UsedImplicitly] özniteliğiyle kodunuzda dolaylı olarak (veya otomatik olarak) çağrılan Unity yaşam döngüsü yöntemlerine (Başlat, Uyan, Güncelle, OnDestroy vb.), Olay yöntemlerine ve diğer işlevlere açıklama ekleyin. Bu öznitelik, UnityEngine.dll'de bulunmasına rağmen, görünüşte belirtilmemiş görünen yöntemler için kod temizleme önerilerini devre dışı bırakmak amacıyla ReSharper tarafından kullanılır. Ayrıca, özellikle müfettiş aracılığıyla başvuruda bulunulan olaylar için Unity ve kod tabanınız için daha yeni kişiler için kodun okunmasını kolaylaştırır.

(Not: ReSharper'ın görünüşte referanssız görünen Unity yaşam döngüsü yöntemleri için kod temizleme önerileri gösterdiğini düşünmüyorum, bu yüzden eski bir tavsiye olabilir.)

Birlikten daha yeni olanlar için yararlı olabileceğini yukarıdaki yazıya katılıyorum. Ben de o etiketlemek için yararlı olacağına kanaat Birlik yaşam döngüsü fonksiyonları sık olarak kullanılmamaktadır Awake, Startve Update. Ama bunun gerçekten "temiz kod" için iyi bir kural olup olmadığını veya okunabilirliği azaltan sadece gürültü olup olmadığını merak ediyorum.


1
Unity'de 2 oyun yayınladım ve bunun var olduğunu bilmiyordum. Eğer yapsaydım muhtemelen netlik için kullanmıştım ve gürültü olarak düşünmezdim.
McAden

1
Hey, yazının orijinal yazarıyım. Evet, özellikle iyileştirilmiş Resharper desteği göz önüne alındığında, yaşam döngüsü yöntemleri için aşırı kilolu olabileceğini düşünüyorum. Ancak, yalnızca müfettiş tarafından başvurulan olay geri çağrılarına (örneğin, animasyonlar ve Unity'nin UI olay sistemi için) açıklama eklemenin yararlı olduğunu düşünüyorum. Kod tabanını yöneten insanlara bağlı - bunu yazdığımda, kimsenin oyun geliştirme deneyimi olmayan bir yazılım danışmanlık şirketinde çalışıyordum, bu yüzden aramızda bir standart oluşturmak istedim. Gönderinin dikkat çekmesini beklemediğim için geriye dönük olarak biraz acımasız.
Mana

Yanıtlar:


10

Hedef demografiye bağlıdır.

Yukarıdaki örnekte hedef demografi, size yardımcı olmayan iletileri bastırdığı için bu özelliklerden yararlanan Yeniden Paylaşım aracıdır. Ancak ReSharper veya benzer bir araç kullanma gereğini hissetmiyorsanız (belki de yapmalısınız, zaman zaman geçerli bir eleştiriye sahipler), o zaman bu demografiyi önemsemeniz gerekmez.

Hiç bir temel Birlik öğretici yaptım herkes çok iyi bilir ki Startve Updateonlara hiçbir yeni bilgi vermeyecek yüzden, Birlik için dolaylı olarak kullanılmaktadır. Eğer bunu bir kez unutursanız, aslında onların kafasını karıştırabilir. Bununla ne söylemek istiyorsun? Bu aslında bir MonoBehaviour değil mi? Ya da farkında olmadığım onu ​​açıkça çağırmanızın belirsiz bir nedeni var mı?

Bununla birlikte, daha ezoterik Birlik olaylarına aşina olmayabilecek deneyimsiz geliştiricilerle çalışıyorsanız Reset(tehlikeli, çünkü açıkça çağırmak, düşündüğünü yapamayabilir) yardımcı olabilir. [UsedImplicitly]Nitelik sonra motor bunun nedeni de yöntemini çağıran sınıf için bakmak gerekmez söyle olabilir. Ama yine de, bu sadece bunu tutarlı bir şekilde yapmak için disiplininiz varsa değerlidir. Ve eğer bu miktarda bir disiplininiz varsa, yorum eklemeyi de kabul edebilirsiniz.


1
Bir "% 99 demografik için hiçbir fayda sağlar" eklerdim. Birkaç saat sonra yeni başlayanlar bile yaşam döngüsü yöntemlerini tanımaya başlayacaktır (VS'de farklı renklidirler!). Ve yeniden paylaşma: pahalı bir lisans, yeniden yapılandırılabilir ve OP'nin dediği gibi muhtemelen zaten yamalı. Bence her ikinci yöntemi tartışmalı değer nitelikleri ile süslemekten daha etkili zaman geçirebilirler .
wondra

@wondra Visual Studio'da farklı renklendirildiğine dikkat çektiğiniz için teşekkür ederiz. Tools -> Options -> Tools for Unity -> General -> Unity Messages syntax highlightingDoğru olarak ayarlanmış olsa da , neden Visual Studio 2017 ile bunu benim için yapmadığını anlamaya çalışacağım .
sonny

1
Visual Studio'nun neden Unity yöntemlerimi renklendirmediğine bakmadım, ancak başka bir cevap, ReSharper'ın Unity olay işlevlerini otomatik olarak tanıyan Unity için bir eklentiye sahip olduğuna dikkat çekti. Bu, ilgili ayar da vardır: ReSharper -> Options -> Code Inspection -> Settings -> Enable code analysis -> Color identifiers.
sonny

6

Hayır, onu kullanmaman gerektiğini savunuyorum.

UsedImplicitly özniteliği Jetbrains.Annotations ad alanından gelir, bu nedenle uygulanabileceği tek durum, kodu kullanan herkesin ReSharper kullanmasıdır.

ReSharper, Unity için bunu zaten sizin için ele alan bir eklentiye sahiptir , sadece kullanılmadıkları uyarıları kaldırmayı değil, aynı zamanda kodu okuyan herkesin Unity tarafından çağrıldığını görebilmeleri için küçük bir Unity sembolü ile işaretler.

Bunları kullanırken yanlış olabilecek bir örnek eklemek istiyorum. MonoBehaviour'dan miras alınan bir sınıfınız olduğunu varsayın, ancak bir refactordan sonra artık miras yok. Özel yöntemleri [UsedImplicitly] ile işaretlediyseniz, doğru uyarıları alamazsınız. Yeniden birleştirmek için Unity eklentisini kullanırsanız, artık MonoBehaviour'dan devralmadığınızı fark edeceksiniz ve yöntemler artık çağrılmadığı için uyarı gönderecektir.


1
ReSharper eklentisinin var olduğunun farkında değildim, işaret ettiğiniz için teşekkürler!
sonny

1
Unity'nin Unity 5 olarak UnityEngine.dll dosyasına ReSharper özniteliklerini dahil etmeye başladığını unutmayın - bu forum gönderisine bakın .
sonny

5

Gerçekten incitemeyeceği fikrini söylerdim.

Unity'nin çalışmalarına çok aşina olan biri için, muhtemelen hiçbir şey eklemez. Bu insanlar zaten Unity'nin çalışma zamanının sizin adınıza ne dediğine oldukça aşina olacaklar.

Ama benim gibi olmayan biri için bu yardımcı olabilir. Ne demek istediğini bilmiyor olsam bile, yukarıya bakardım ve bu muhtemelen kodda neler olup bittiğini daha iyi anlamam için yeterli olacaktır.

Ayrıca, yöntemler hakkında yanlış uyarı veren statik analiz araçlarını kullanırsa, bu uyarıları bir şekilde susturmak istersiniz, çünkü "göz ardı edilebilir" uyarı gürültüsü, bu tür çıktılardaki gerçek uyarıları görmeyi zorlaştırır . Bu tür uyarıları cerrahi, yerelleştirilmiş bir tarzda (bu durumda rahatsız edici yöntemleri niteliklerle süsleyerek) görmezden gelmek, proje boyunca söz konusu uyarıyı devre dışı bırakmak gibi daha geniş önlemlerden daha iyidir.


1
Cevabınız için teşekkürler. Soruyu gönderdiğimde cevabınıza benzer şekilde düşünüyordum, ancak niteliğin tutarlı bir şekilde kullanılmaması durumunda potansiyel olarak yanıltıcı olabileceğini belirten diğer posterlere katılıyorum.
sonny

3
Evet, bunlar adil noktalar. Biri varsa yok sen niteliğini sağlamaya yardımcı olabilir bu aşkın gezileri ve ciddi bir muamele bu uyarıların eşit uygulandığını statik analiz var. Ama eğer yapmazsan? O zaman hemen hemen insan hatasına bağlı.

2

Bu yaklaşımdaki sorun, inanılmaz derecede hataya meyilli olmasıdır.

Güvenilir değilse, etiketler yararlı bilgiler iletemez ve bunların varlığı veya yokluğu bazen zararlı olan yanlış bilgileri iletmeyi başaracaktır.

Bununla devam etmeye karar verirseniz , yapılması zor olmayan insan hatasını kaldırmanız gerekir , ancak daha önce böyle bir şey yapmadıysanız 2 saat iyi bir çalışma gerektirir. Her biri kendi avantajları olan 2 yaklaşım vardır - bunlardan birini kullanabilirsiniz:

  1. Check-in veya otomatik derlemede uygun olmayan kodu doğrulayın ve reddedin.
  2. Check-in sırasında veya otomatik derlemede etiketleri düzeltmek için otomatik kod düzenleme.

Sahip olmaya değer mi? Evet. Zamanınızın 2 saati değerinde mi? Çağrınız.


1
Farklı bir yanıtı kabul ettim, ancak UsedImplicitlybu amaçla bu özelliği kullanmayı düşünen herkes için insan hatasını ortadan kaldırma konusunda büyük bir noktaya değindiniz .
sonny
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.