Apakah anotasi metode siklus hidup Persatuan dengan UsedImplicitly
atribut 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.
- 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.
Jawaban:
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
Start
danUpdate
digunakan 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.sumber
Tools -> Options -> Tools for Unity -> General -> Unity Messages syntax highlighting
diatur ke true.ReSharper -> Options -> Code Inspection -> Settings -> Enable code analysis -> Color identifiers
.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.
sumber
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.
sumber
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:
Apakah layak untuk memilikinya? Iya. Apakah nilainya 2 jam dari waktu Anda? Panggilanmu.
sumber
UsedImplicitly
atribut untuk tujuan ini.