Haruskah metode siklus hidup Unity dijelaskan dengan atribut UsedImplicitly?


9

Apakah anotasi metode siklus hidup Persatuan dengan UsedImplicitlyatribut meningkatkan keterbacaan kode Anda?

Sebagai contoh:

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

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

Posting blog ini pada "Structure Your Unity MonoBehaviours" menyarankan pendekatan ini sebagai konvensi yang bermanfaat.

  1. Buat anotasi metode siklus hidup Persatuan (Mulai, Sedarlah, Perbarui, OnDestroy dll.), Metode acara, dan fungsi lain yang secara implisit (atau otomatis) dipanggil dalam kode Anda dengan atribut [UsedImplicitly] atribut. Atribut ini, meskipun termasuk dalam UnityEngine.dll, digunakan oleh ReSharper untuk menonaktifkan saran pembersihan kode untuk metode yang tampaknya tidak direferensikan. Ini juga membantu membuat kode lebih mudah dibaca untuk orang-orang yang lebih baru ke Unity dan basis kode Anda, terutama untuk acara yang dirujuk melalui inspektur.

(Catatan: Saya tidak berpikir ReSharper menunjukkan saran pembersihan kode untuk metode siklus hidup Unity yang tampaknya tidak direferensikan, jadi itu mungkin saran yang sudah ketinggalan zaman.)

Saya setuju dengan posting di atas bahwa itu bisa bermanfaat bagi mereka yang lebih baru ke Unity. Saya juga berpikir itu bisa berguna untuk label mereka fungsi siklus hidup Unity yang tidak digunakan sesering Awake, Start, dan Update. Tetapi saya bertanya-tanya apakah ini sebenarnya adalah konvensi yang baik untuk "kode bersih", atau apakah hanya noise yang mengurangi keterbacaan.


1
Saya telah menerbitkan 2 game di Unity dan tidak tahu ini ada. Jika saya melakukannya saya mungkin akan menggunakannya untuk kejelasan dan tidak akan menganggapnya sebagai kebisingan.
McAden

1
Hai, saya penulis asli posting ini. Ya saya pikir itu bisa berlebihan untuk metode siklus hidup, terutama mengingat dukungan Resharper yang ditingkatkan. Namun saya pikir itu berguna untuk membubuhi keterangan event callback (misalnya untuk animasi & sistem acara UI Unity) yang hanya direferensikan melalui inspektur. Terserah orang-orang yang mengelola basis kode - ketika saya menulis ini, saya bekerja di sebuah perusahaan konsultan perangkat lunak di mana tidak ada yang memiliki pengalaman pengembang game, jadi saya ingin membuat standar di antara kami. Agak retrospektif, karena saya tidak berharap posting mendapat perhatian.
Mana

Jawaban:


10

Itu tergantung pada target demografis.

Dalam contoh di atas, target demografis adalah alat ReSharper, yang diuntungkan dari atribut ini karena menekan pesan yang tidak membantu Anda. Tetapi jika Anda tidak merasa perlu menggunakan ReSharper atau alat serupa (walaupun mungkin Anda harus, mereka memiliki beberapa kritik yang valid dari waktu ke waktu), maka Anda tidak perlu peduli dengan demografis itu.

Siapa pun yang pernah melakukan tutorial dasar Unity tahu betul itu Startdan Updatedigunakan secara implisit oleh mesin Unity, sehingga tidak akan memberi mereka informasi baru. Bahkan mungkin membingungkan mereka jika Anda lupa ini sekali. Apa yang ingin kamu katakan dengan itu? Apakah ini mungkin sebenarnya bukan MonoBehaviour? Atau adakah alasan yang tidak jelas mengapa Anda harus menyebutnya secara eksplisit yang tidak saya sadari?

Akan tetapi, ini dapat membantu jika Anda bekerja dengan pengembang yang tidak berpengalaman yang mungkin tidak terbiasa dengan peristiwa Unity yang lebih esoteris seperti Reset(berbahaya, karena memanggilnya secara eksplisit mungkin tidak melakukan apa yang Anda pikirkan). The [UsedImplicitly]atribut mungkin kemudian memberitahu mereka bahwa mereka tidak perlu mencari kelas yang memanggil metode yang karena mesin tidak. Tetapi sekali lagi, ini hanya bernilai jika Anda memiliki disiplin untuk melakukan ini secara konsisten. Dan jika Anda memiliki disiplin diri sebanyak itu, Anda bisa menyetujui menambahkan komentar.


1
Saya akan menambahkan "untuk 99% demografis tidak memberikan manfaat". Bahkan pemula setelah beberapa jam akan mulai mengenali metode siklus hidup (mereka diberi warna berbeda dalam VS!). Dan resharper adalah: lisensi yang mahal, dapat dikonfigurasi ulang, dan seperti yang dikatakan OP mungkin sudah ditambal. Saya pikir seseorang dapat menghabiskan waktu mereka lebih efektif daripada mendekorasi setiap metode kedua dengan atribut nilai yang bisa diperdebatkan.
wondra

@wondra Terima kasih telah menunjukkan bahwa mereka berwarna berbeda di Visual Studio. Saya akan mencoba mencari tahu mengapa tidak melakukannya untuk saya dengan Visual Studio 2017, meskipun Tools -> Options -> Tools for Unity -> General -> Unity Messages syntax highlightingdiatur ke true.
Sonny

1
Saya tidak melihat mengapa Visual Studio tidak mewarnai metode Unity saya, tetapi jawaban lain menunjukkan bahwa ReSharper memiliki plugin untuk Unity yang juga secara otomatis mengenali fungsi acara Unity. Ada juga pengaturan terkait ini: ReSharper -> Options -> Code Inspection -> Settings -> Enable code analysis -> Color identifiers.
sonny

6

Saya berpendapat bahwa tidak, Anda tidak boleh menggunakannya.

Atribut UsedImplicitly berasal dari Jetbrains.Annotations namespace sehingga satu-satunya kasus di mana itu mungkin berlaku adalah jika semua orang yang menggunakan kode akan menggunakan ReSharper.

ReSharper memiliki plugin untuk Unity yang sudah menangani ini untuk Anda, memastikan tidak hanya untuk menghapus peringatan bahwa mereka tidak digunakan tetapi juga menandainya dengan simbol Unity kecil sehingga siapa pun yang membaca kode dapat melihat bahwa mereka dipanggil oleh Unity sendiri.

Saya juga ingin menambahkan contoh saat menggunakannya mungkin salah. Asumsikan Anda memiliki kelas yang diwarisi dari MonoBehaviour, tetapi setelah refactor tidak lagi memiliki warisan. Jika Anda menandai metode pribadi dengan [Digunakan Secara Jelas] maka Anda tidak akan menerima peringatan yang benar. Jika Anda menggunakan plugin Unity untuk resharper, ia akan melihat bahwa Anda tidak lagi mewarisi dari MonoBehaviour dan akan memberikan peringatan karena metode tersebut memang tidak lagi disebut.


1
Saya tidak tahu bahwa plugin ReSharper ada, terima kasih telah menunjukkannya!
Sonny

1
Perhatikan bahwa Unity telah mulai memasukkan atribut ReSharper di UnityEngine.dll pada Unity 5 - lihat posting forum ini .
Sonny

5

Saya akan berargumen bahwa itu tidak benar-benar menyakitkan.

Untuk seseorang yang sangat terbiasa dengan pekerjaan Unity, mungkin tidak menambah apa pun. Orang-orang itu sudah cukup akrab dengan apa yang disebut runtime Unity atas nama Anda.

Tetapi bagi seseorang yang tidak, seperti saya, mungkin akan membantu. Bahkan jika saya tidak tahu apa artinya begitu saja, saya akan mencarinya, dan itu mungkin cukup untuk memberi saya pemahaman yang lebih baik tentang apa yang terjadi dalam kode.

Juga, jika seseorang memang menggunakan alat analisis statis yang salah memperingatkan tentang metode, maka Anda akan ingin untuk menenangkan peringatan itu entah bagaimana, karena kebisingan peringatan "diabaikan" membuat lebih sulit untuk melihat peringatan nyata dalam output semacam itu. Biasanya lebih baik untuk mengabaikan peringatan semacam itu dengan cara bedah, yang dilokalkan (dalam hal ini dengan mendekorasi metode yang menyinggung dengan atribut) daripada melalui tindakan yang lebih luas seperti melumpuhkan peringatan khusus di seluruh proyek.


1
Terima kasih atas jawaban anda. Saya berpikir sama dengan jawaban Anda ketika saya memposting pertanyaan, tetapi saya setuju dengan poster lain yang menunjukkan bahwa itu bisa berpotensi menyesatkan jika atribut tidak digunakan secara konsisten.
sonny

3
Ya, itu adalah poin yang adil. Jika salah satu tidak memiliki analisis statis yang perjalanan lebih ini, dan salah satu memperlakukan peringatan-peringatan itu serius, yang dapat membantu Anda memastikan atribut diterapkan secara seragam. Tetapi jika tidak? Cukup banyak kesalahan manusia.

2

Masalah dengan pendekatan ini adalah sangat rentan kesalahan.

Jika tidak dapat diandalkan, tag akan gagal menyampaikan informasi yang bermanfaat, dan ada tidaknya mereka kadang-kadang akan berhasil menyampaikan informasi palsu, yang berbahaya.

Jika Anda memutuskan untuk melakukannya, Anda harus menghapus kesalahan manusia, yang tidak sulit dilakukan, tetapi membutuhkan 2 jam kerja yang baik jika Anda belum melakukan hal seperti ini sebelumnya. Ada 2 pendekatan - masing-masing dengan keunggulannya sendiri - Anda dapat menggunakan salah satu dari itu:

  1. Verifikasi dan tolak kode yang tidak patuh pada saat check-in atau pembuatan otomatis.
  2. Pengeditan kode secara otomatis untuk memperbaiki tag pada saat check in atau membangun otomatis.

Apakah layak untuk memilikinya? Iya. Apakah nilainya 2 jam dari waktu Anda? Panggilanmu.


1
Saya telah menerima jawaban yang berbeda, tetapi Anda membuat poin bagus tentang menghapus kesalahan manusia untuk siapa saja yang berpikir tentang menggunakan UsedImplicitlyatribut untuk tujuan ini.
Sonny
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.