Saya tahu judul pertanyaan itu sangat subyektif, tetapi saya dihadapkan dengan penggunaan ??
operator oleh rekan-rekan saya, di mana pada saat yang sama saya tidak terlalu senang / nyaman menerapkan var
kode baru yang akan datang.
Argumen yang diberikan untuk menggunakan ??
operator adalah, menghilangkan keterbacaan dalam kode.
Pertanyaan saya adalah, bukankah hal yang sama terjadi ketika Anda mulai menggunakan var
?
c#
coding-style
readability
Numan
sumber
sumber
??
operator penggabungan nol setelah dijelaskan, mereka tidak boleh berada di dekat kode produksi.Jawaban:
Operator penggabungan nol (??)
Secara pribadi, saya tidak melihat kelemahan menggunakan operator ini. Pertimbangkan tiga contoh kode berikut, dari operator baru 'mudah' hingga 'kompleks'.
Tanpa sihir:
Operator ternary:
Null penggabungan:
Alasan operator ini ditemukan adalah karena mereka mewakili operasi pemrograman yang sangat umum . Tidak ingin menggunakannya karena Anda tidak terbiasa hanya keras kepala . Bahasa berevolusi, fitur berevolusi, belajar menggunakannya!
kata kunci var
Saya memiliki pendapat yang agak berbeda tentang kata kunci var. Jenis variabel sering memberikan informasi tambahan tentang kode Anda. Saya menemukan menyembunyikan jenis dengan menggunakan kata kunci var kadang membuat kode kurang dibaca. Anda tidak tahu apa yang diharapkan tanpa menggunakan pelengkapan otomatis, atau melayang di atas pengidentifikasi untuk melihat apa yang sebenarnya. Menurut pendapat saya, ini menghasilkan kode yang lebih lambat untuk membaca / menulis.
Saya menggunakan kata kunci ketika saya menemukan bahwa jenisnya tidak memberikan banyak informasi tambahan.
Sebagai contoh untuk pernyataan terakhir:
sumber
Factory.CreateSomeType
kembaliIEnumerable<SomeType>
. Suatu hari, untuk alasan apa pun, itu berubah untuk kembaliSomeType[]
. Jika Anda telah menggunakan var, itu hanya kompilasi ulang.Factory.CreateSomeType()
perubahan mengembalikan suatuISomeType
?null
sepenuhnya. Selain itu, semakin saya mencari alternatifnull
, semakin saya sadari menggunakannull
kadang-kadang solusi terbersih. Contoh yang saya berikan adalah IMHO yang tidak terlalu buruk, dan saya menganggapnya sebagai penggunaan yang sesuai untuk jenis yang dapat dibatalkan.var memungkinkan kode verbose lebih sedikit, yang meningkatkan keterbacaan. Menurut pendapat saya, keterbacaan tidak boleh diukur dengan berapa banyak detail yang Anda lihat, tetapi berapa banyak detail yang disembunyikan pada pandangan pertama. Selain contoh Linq, var memungkinkan pengetikan bebek pada level kode sumber, dengan memberikan contoh berikut:
Siapa yang peduli apa jenis label asalkan memberikan properti Teks?
sumber
Saya tidak memiliki komentar serius pada
??
operator, karena saya tidak pernah menggunakan bahasa dengan operator seperti itu. Mengenaivar
, orang memprogram dalam bahasa seperti Ruby, Python, Perl dan PHP yang sepenuhnya mengetik secara implisit sepanjang waktu. Penduduk asli dari bahasa-bahasa ini menyadari bahwa tipe formal suatu variabel biasanya adalah noise yang tidak relevan. Anda lebih tertarik pada variabel apa yang bisa dilakukan , yaitu antarmuka struktural / bebek.Demikian pula, saya kebanyakan program di D. D diketik secara statis tetapi memiliki
auto
kata kunci, yang setara denganvar
. Itu dianggap idiom untuk menggunakannya di mana-mana kecuali Anda melihat kebutuhan khusus untuk menekankan jenis sesuatu kepada pembaca atau (melalui konversi implisit) kompiler. Kecuali kadang-kadang ketika digunakan sebagai tipe fungsi kembali (ini diperbolehkan dalam D), saya tidak pernah menemukan itu untuk menghambat keterbacaan, karena saya kebanyakan berpikir dalam hal struktural / antarmuka bebek, bukan tipe formal / nominatif, ketika saya memprogram.Selain itu, IMHO menggunakan di
var
mana saja mungkin adalah contoh yang baik KERING. Jenis sesuatu harus ditentukan dalam satu dan hanya satu tempat, dan kemudian secara otomatis diperbanyak kapan pun perlu diperbanyak. Jika Anda menggunakanvar
dan tipe formal dari variabel perlu diubah di beberapa titik, perubahan yang diperlukan akan secara otomatis diperbanyak di mana pun diperlukan oleh kompiler selama program masih tipe-benar, daripada programmer harus secara manual mengubah setiap instance . Ini adalah Good Thing (TM).sumber
Saya pikir ini adalah pertanyaan untuk tim pada akhirnya. Jika itu tidak dapat dibaca oleh orang lain di tim saya maka saya tidak akan menggunakannya, meskipun saya mungkin mencoba beberapa kali untuk meyakinkan mereka dengan contoh, atau dengan menunjukkan singkatan analagous (seperti + =) yang mereka temukan lebih mudah dibaca.
Namun, jika bekerja sendiri maka saya temukan ?? dan var mudah dibaca tanpa batas. Bahkan
cukup jelas bagi saya.
Operator ternary dan
dynamic
merupakan hal yang berbeda, tentu saja.sumber
var a = b ?? c ?? d ?? e ?? String.Empty ?? "";
String.Empty
pernah kembalinull
, kita berada dalam satu neraka dari banyak kode yang rusak.Memikirkannya sebentar, komentar ini memberi tahu saya orang yang membuat komentar, tidak memahaminya sebagaimana mestinya. Kemungkinan besar itu benar dalam situasi tertentu, tetapi secara keseluruhan, saya tidak mengabaikan sesuatu yang menurut tim C # cukup penting untuk ditambahkan karena "keterbacaan". Saya menempatkan ini dalam kategori yang sama dari
if(boolean_object)
vsif(boolean_object == true)
. Beberapa orang berpendapat bahwa yang kedua lebih mudah dibaca, tetapi pada kenyataannya itu hanya menambahkan kode tambahan untuk seseorang untuk membaca / mengetik, dan dalam beberapa situasi dapat lebih membingungkan (berpikirif(boolean_object != false)
)Tim C # telah memungkinkan Anda untuk tidak menentukan sesuatu yang Anda tahu apa yang akan terjadi. Kecuali saya benar-benar perlu mendefinisikan apa yang akan menjadi variabel (baik itu sangat penting bahwa objek kembali adalah tipe x, atau itu benar-benar tidak dapat dibaca), saya gunakan
var
.var x = "MY_STRING";
Saya tahu ini string dari melihatnya. Sebenarnya, saya tidak benar-benar peduli bahwa itu adalah string selama itu melakukan apa yang saya butuhkan. Mendefinisikan tipe variabel adalah untuk keuntungan saya, bukan milik kompiler. Jika ada sesuatu yang salah, kompiler akan memberi tahu saya ketika itu berjalan jika saya memiliki tipe variabel yang salah.sumber
Menurut saya,
var
kata kunci yang digunakan adalah yang terbaik dalam situasi di mana ia diperkenalkan - permintaan LINQ. Dalam kueri ini, jenis hasil yang dikembalikan sering kali memiliki beberapa nama yang berbelit-belit besar yang sulit ditentukan sebelumnya dan tidak membantu pemahaman pembaca tentang apa yang kode Anda lakukan.Namun, melakukan
var text = "Some text " + variableName + "some more text."
itu hanya malas.EDIT: @Jorg Anda melompat pada jawaban yang sengaja disederhanakan tetapi tidak menambahkan apa pun pada diskusi. OK, bagaimana dengan ini untuk contoh yang lebih baik:
var items = doc.DocumentElement.FirstChild.ChildNodes;
Jika Anda dapat mengetahui jenis dari itu saya akan memberi Anda cookie.sumber
"Some text "
adalahstring
, maka Anda memiliki masalah yang jauh lebih besar untuk dikhawatirkan daripada jumlahvar
s dalam kode Anda.var
; masalahnya adalah nama variabel jelek "item". Jika Anda menggunakan nama variabel yang baik, tidak ada yang salah dengan ituvar
.Saya punya masalah mendasar dengan menggunakan var.
Dalam contoh ini semuanya berdampingan, tetapi masalahnya sebenarnya dengan solusi besar dengan perpustakaan atau proyek bersama.
Pertimbangkan ini:
Apa yang terjadi jika GetMeAnObject diubah, oleh orang lain, sesuai dengan kebutuhan mereka?
Metode MainProgram akan memiliki kesalahan merah besar pada .PerformOperation (). Apa yang terjadi? PerformOperation bekerja dengan sangat baik sebelumnya. Kami melihat metode diObject dan hanya menghilang tanpa jejak. Itu ada di sana terakhir kali, dan kita perlu metode itu. Anda bisa menghabiskan waktu yang lama mengejar ekor dan mencoba mencari tahu mengapa, jika MyFirstObject memiliki metode yang disebut PerformOperation, sekarang tidak dapat dilihat. Semua orang "tahu" bahwa GetMeAnObject mengembalikan MyFirstObject, jadi tidak ada gunanya memeriksa itu.
Jika Anda secara eksplisit mengetikkanObject maka Anda akan memiliki kesalahan Cast Tidak Valid pada baris yang memanggil GetMeAnObject, dan akan sangat jelas bahwa GetMeAnObject mengembalikan jenis yang tidak seperti yang Anda harapkan.
Singkatnya, deklarasi eksplisit berarti Anda tahu apa artinya kesalahan. Pemain yang tidak valid berarti Anda mengharapkan satu jenis dan jenis lainnya dikembalikan. Anggota yang tidak dikenal berarti anggota tersebut tidak dikenal.
sumber
var
? Bahasa tidak dapat diharapkan untuk melindungi terhadap perilaku semacam itu - bagaimana jika mereka memodifikasi MyFirstObject secara langsung? Itu masih akan rusak, tetapi tidak ada sintaks yang bisa menyelamatkan Anda dari itu. Saya menganggap ini sebagai kekuatanvar
, bahkan: bagaimana jika alih-alih mengembalikan MySecondObject, Anda sekarang malah mengembalikan IMyFirstObject?