Kembali di masa lalu, kami melakukan notasi Hongaria. Itu sekarang dianggap ketinggalan jaman , dan sebagian besar saya tidak menggunakannya lagi, tapi saya masih menemukan penggunaan m_
awalan untuk menunjukkan bidang anggota.
Bagi saya, jika saya membaca kode orang lain, dan saya melihat ini:
count = 3;
Saya berasumsi itu count
adalah variabel lokal untuk fungsi itu dan saya sedang melakukan sesuatu yang akan digunakan di tempat lain dalam fungsi; jika saya melihat ini:
m_count = 3;
Saya segera menyadari bahwa saya memperbarui keadaan objek.
Pedoman gaya Microsoft mengatakan bahwa itu adalah cara yang salah untuk melakukan sesuatu. Saya seharusnya memberi nama bidang non-publik saya persis seperti variabel sementara yang didefinisikan dalam fungsi. Tidak m_
, bahkan garis bawah yang sederhana.
Ya, kita dapat mendefinisikan gaya pengkodean kita sendiri, tetapi kemudian saya harus bergulat dengan berbagai alat analisis kode statis, untuk meyakinkan mereka bahwa cara kita melakukan sesuatu adalah OK.
Saya senang untuk mengubah ke gaya Microsoft, tetapi saya ingin tahu mengapa semuanya seperti itu.
Mengapa sekarang dianggap buruk untuk dapat mengetahui apakah suatu variabel adalah fungsi lokal atau anggota?
PS Ini sangat mirip dengan Apa praktik terbaik yang dianggap saat ini mengenai kata kunci "ini" di depan bidang dan metode dalam c #? , tapi saya bertanya tentang m_
tidakthis.
PPS Juga lihat Mengapa Microsoft membuat parameter, variabel lokal, dan bidang pribadi memiliki konvensi penamaan nama yang sama?
sumber
this
kata kunci? Tidak bisakah Anda merujuk pada anggota yang menggunakanthis
, sepertithis.count
?count
tidak muncul begitu saja karena tidak dinyatakan dalam metode. Terus terang argumen "out of IDE" BENAR-BENAR lemah. Terutama karena bahkan ada alat peninjau kode yang bekerja DI IDE.Jawaban:
Ketika mereka bekerja pada API untuk Windows, Microsoft merekomendasikan penggunaan Notasi Hongaria, menggunakan 'm_', serta 'i', 'sz', dll. Pada saat itu, ini berguna karena IDE tidak kuat cukup untuk menunjukkan informasi ini kepada Anda.
C #, di sisi lain, memiliki IDE yang sangat kuat sejak awal.
Jadi mereka membuat rekomendasi dalam Panduan Penamaan Microsoft untuk C # untuk bidang statis atau terlindungi publik:
Sekarang Anda dapat mengarahkan mouse dengan mouse Anda, atau tekan CTRL + K + W, dan mendapatkan semua informasi tentang anggota, Microsoft sampai pada penentuan bahwa awalan adalah bentuk yang buruk; mereka adalah solusi manual untuk masalah yang sudah diselesaikan.
Bidang pribadi secara khusus dikecualikan dari pedoman, tetapi Microsoft tampaknya sampai pada kesimpulan bahwa ini adalah kasus bahkan untuk bidang pribadi maju secara internal, yang dapat Anda lihat jika Anda mengarahkan Resharper di .NET 4.5 atau .NET Core.
Gunakan alat Anda, jangan lakukan secara manual.
sumber
C # tidak memiliki variabel global, sehingga hanya menyisakan variabel lokal dan bidang kelas.
Dan jika Anda memiliki begitu banyak variabel lokal sehingga Anda lupa apakah pengenal itu salah satu, Anda pasti telah melanggar salah satu pedoman untuk mengelola kompleksitas dengan sangat menyedihkan.
Cobalah untuk mengekstrak parameter-objek, cobalah untuk membagi fungsi Anda menjadi beberapa yang lebih sederhana, Anda tentu harus memperbaiki kode Anda kecuali jika Anda suka tenggelam dalam hal-hal kecil dan rumit, serta tidak memedulikan kemampuan pemeliharaan.
Sekarang kita telah menetapkan bahwa tujuan "this-is-a-member" -dekorasi tidak lagi berlaku karena fungsi-ruang lingkup harus terlalu kecil dan ruang lingkup global tidak ada, ada satu kelemahan dari penanda tersebut: Mereka menghambat memindahkan argumen / variabel lokal ke anggota, atau sebaliknya.
sumber
Mengapa pengembang menghindari menambahkan ruang nama dengan direktif namespace menggunakan?
System.DateTime()
jauh lebih eksplisit daripadaDateTime()
. Ini memberitahu saya apa yang saya hadapi. Apakah hanya karena kita pengetik yang malas?Tidak. Kami pengetik yang malas, tapi bukan itu sebabnya.
Kami lebih suka gaya pengkodean yang memungkinkan kami mengabaikan detail dan fokus pada abstraksi. Memaksa nama untuk mengomunikasikan detail struktur mengganggu. Ketika saya bekerja pada algoritma yang rumit, saya tidak ingin nama yang bersikeras mengingatkan saya setiap detail kecil tentang hal yang saya kerjakan. Saya hanya perlu nama agar saya tidak bingung
Timer
danDateTime
. Saya akan khawatir jika itu kompatibel di tempat lain.Itu alasan yang sama Anda tidak ingin dua orang di tim Anda bernama Jon. Fakta bahwa mereka memiliki nama belakang bukan alasan untuk memberi mereka awalan atau sufiks. Aku hanya akan memanggilmu Skeet. Apa pun yang lebih adalah rasa sakit.
sumber
Mari kita sedikit berkembang.
Ada 3 gaya awalan umum, yang semuanya kadang-kadang ditemui dalam kode c #:
Awalan seperti itu biasanya digunakan dalam implementasi privat kelas . Rekomendasi Microsoft terutama tentang bagian-bagian kelas yang terbuka.
Keuntungan menggunakan
m_
over_
adalah bahwa awalan bisa sama di seluruh basis kode Anda jika Anda menggunakan c # serta bahasa di mana menggunakan_
sebagai awalan tidak diperbolehkan . * Keuntunganm_
lebih darithis.
itu adalah lebih pendek dan bahwa Anda tidak akan secara tidak sengaja lupakan awalannya.Keuntungan
_
lebihm_
adalah lebih pendek dan segala sesuatu yang dimulai dengan awalan diurutkan di atas disortir berdasarkan abjad oleh alat. Keuntungan_
lebih darithis.
itu adalah lebih pendek dan Anda tidak akan sengaja melupakan awalan.Keuntungan
this.
lebihm_
dan_
adalah bahwa Anda dapat menggunakannya dalam basis kode di mana_
ataum_
tidak konvensi yang diterima dan universal. Itu juga berarti tidak ada yang perlu tahu tentang_
ataum_
konvensi, yang dapat dilihat sebagai hal yang lebih sederhana. Sebagai kerugian, karena kompiler tidak peduli dengan awalan ini,this.
awalan kadang-kadang akan hilang, dan karenanya tidak dapat diandalkan sebagai indikator.* Setelah Anda mulai mengakses kelas C # yang digunakan
_
dari C ++ / CLI (yang benar-benar tidak boleh digunakan_
), Anda akan melihat bahwa menyetujui awalan umum lebih kompleks dari yang seharusnya. Memutuskan untuk tidak memiliki awalan menghilangkan kebisingan itu. Gabungkan ini dengan jawaban Deduplicator, yang saya akan parafrase sebagai "keuntungan dari awalan hampir dapat diabaikan", dan itu memberi kita: "Ada masalah kecil ketika menggunakan awalan, dan terbalik kecil, jadi itu adalah pilihan yang valid untuk tidak gunakan mereka ".Ada pertanyaan lama tentang stackoverflow yang terkait dengan ini.
sumber
Perlu dicatat bahwa panduan gaya MS hanya berbicara tentang metode dan variabel publik dan yang dilindungi. yaitu yang devs lain akan melihat apakah mereka menggunakan perpustakaan Anda.
Gagasannya adalah bahwa perpustakaan Microsoft diberikan tampilan dan rasa standar untuk pengembang memakannya.
Anda bebas menggunakan gaya apa pun yang Anda suka pada variabel pribadi atau lokal Anda.
Setelah mengatakan bahwa awalan variabel tidak disarankan secara umum karena sejumlah alasan
sumber
Dan Anda akan benar jika Anda membaca kode sumber yang menghormati konvensi gaya C #. Dalam kode seperti itu:
memberikan nilai ke bidang.
memberikan nilai ke variabel lokal.
Oleh karena itu, konvensi gaya C # jelas dan tidak ambigu. Mereka memaksa Anda untuk tidak menggunakan awalan hanya karena Anda tidak membutuhkannya.
Adapun kode sumber yang penulis memutuskan untuk menggunakan konvensi pribadi mereka, Anda harus bertanya kepada mereka secara pribadi mengapa mereka membuat pilihan untuk melakukannya. Jika mereka tidak menggunakan awalan seperti garis bawah, sementara tidak menggunakan
this.
salah satu, itu akan secara efektif menyebabkan tidak hanya sulit untuk membaca kode, tetapi juga kasus-kasus di mana konvensi tambahan akan diperlukan:Namun di sini, Anda salah.
Lebih banyak mengetik saat Anda menulis kode di Notepad. Dengan IDE dengan pelengkapan otomatis atau, lebih baik, IntelliSense, perbandingan antara
this.count
danm_count
tidak sejelas itu. Perhatikan tanda Shift+ yang -diperlukan untuk mengetik garis bawah.Adapun "mudah dilupakan," lagi, ini hanya relevan untuk pengguna Notepad. Tidak hanya StyleCop dan Resharper tidak akan membiarkan Anda lupa menempatkan
this.
ketika dibutuhkan, tetapi setelah beberapa jam pemrograman, meletakkanthis.
ketika dibutuhkan menjadi kebiasaan.sumber
this
hanya ketika Anda membutuhkannya menghasilkan perasaan yang sangat tidak konsisten dan mengganggu saya terlalu sering. Jika Anda akan menggunakanthis
alih-alih awalan, saya yakin Anda harus selalu menggunakannya. Dalam hal ini, itu menjadi awalan dan Anda mungkin juga menggunakannya_
.Maksud saya adalah memperluas jawaban @CandiedOrange dan @Ewan.
Awalan membuat refactoring lebih sulit
Saat kode Anda berkembang, variabel dan metode dapat mengubah cakupannya. Misalnya. Anda dapat membuat metode pribadi dan kemudian menemukan bahwa itu harus tersedia untuk kelas (baru) lainnya juga. Serupa dapat terjadi pada parameter metode dan variabel lokal.
Katakanlah Anda membuat kalkulator Pajak. Menurut prinsip lingkup visibilitas sewa untuk variabel Anda mulai dengan metode yang menggunakan keduanya, tarif pajak dan nilai dasar sebagai parameter:
(contohnya mungkin terlihat Java-ish ...)
selanjutnya Anda harus menerapkan operasi terbalik dan menurut TDD Anda melakukannya dengan sedikit usaha:
TDD berikutnya ingin Anda mengubah kode menjadi lebih bersih yang mengurangi daftar parameter kedua metode.
(Ya, Anda akan mengekstraksi perhitungan berlipat ganda terlebih dahulu, tetapi biarkan saya mengerti maksud saya ...)
Solusi yang jelas adalah mengubah tarif pajak menjadi variabel anggota dengan meneruskannya sebagai parameter konstruktor.
Seperti yang Anda lihat, kami harus mengubah semua baris metode yang ada (setiap baris yang kami gunakan
p_TaxRateInpercent
adalah tepat.Masalahnya adalah, Anda tidak memiliki dukungan dari IDE Anda untuk melakukan penggantian nama di seluruh kelas. Satu-satunya membantu pencarian / penggantian yang juga akan mengubah konstruktor atau bagian apa pun yang secara tidak sengaja berisi string
p_TaxRateInpercent
.Anda IDE mungkin menawarkan perubahan ke ... refactoring untuk nama variabel yang tidak ditentukan, tetapi ini mungkin terbatas pada ruang lingkup metode ini
Tanpa awalan hanya tanda tangan metode yang akan berubah. Tidak perlu mengganti nama sama sekali.
Awalan riwayat SCM yang berantakan ketika diubah
Juga SCM mencatat perubahan awalan sebagai perubahan dalam logika meskipun logika tidak berubah! Sejarah SCM berantakan dengan perubahan teknis ini menyembunyikan apa yang penting dan meningkatkan risiko konflik dengan perubahan (logika nyata) orang lain.
sumber
Saya menggunakan awalan _ untuk semua variabel anggota. Saya benci awalan 'ini' karena, sementara beberapa orang mengklaim itu adalah cara yang tepat untuk melakukan sesuatu - ini menambah banyak noise / kekacauan pada basis kode Anda. Satu garis bawah juga merupakan praktik umum dalam sampel Microsoft.
Jadi, dalam contoh Anda, saya harus:
sumber