Saya menemukan idiom pemrograman ini baru-baru ini:
const float Zero = 0.0;
yang kemudian digunakan dalam perbandingan:
if (x > Zero) {..}
Adakah yang bisa menjelaskan apakah ini benar-benar lebih efisien atau dapat dibaca atau dipelihara daripada:
if (x > 0.0) {..}
CATATAN: Saya dapat memikirkan alasan lain untuk mendefinisikan konstanta ini, saya hanya ingin tahu tentang penggunaannya dalam konteks ini .
x
memiliki tipefloat
, makax > 0.0
paksakan promosidouble
, yang mungkin kurang efisien. Itu bukan alasan yang baik untuk menggunakan konstanta bernama, hanya untuk memastikan konstanta Anda memiliki tipe yang benar (misalnya0f
,float(0)
ataudecltype(x)(0)
).13.37
tidakfloat
, itudouble
. Jadi, jika Anda menginginkannyafloat
maka mungkin saja tutor Anda benar. Dalam beberapa konteks (mis. Penugasan ke float)13.37
akan secara implisit dikonversi kefloat
yang Anda inginkan, dan dalam konteks lain (mis. Pengurangan tipe templat) tidak akan, sedangkan yangstatic const float
selalu dimulai sebagai jenis yang Anda inginkan. Oleh karena itu, lebih aman. Pikiran Anda, jadi akan13.37f
! Namun, ada alasan lain untuk menghindari makro selain "keamanan jenis", jadi kemungkinan besar tutor memberi Anda argumen yang buruk.Jawaban:
Kemungkinan alasannya adalah jenis caching, penamaan atau pemaksaan
Caching (tidak berlaku)
Anda ingin menghindari biaya membuat objek selama tindakan perbandingan. Di Jawa contohnya adalah
ini melibatkan proses pembuatan yang cukup berat dan lebih baik dilayani menggunakan metode statis yang disediakan:
Ini memungkinkan perbandingan tanpa menimbulkan biaya pembuatan berulang karena BigDecimal sudah di-cache oleh JVM selama inisialisasi.
Dalam hal apa yang telah Anda gambarkan, primitif melakukan pekerjaan yang sama. Ini sebagian besar berlebihan dalam hal caching dan kinerja.
Penamaan (tidak mungkin)
Pengembang asli berupaya memberikan konvensi penamaan yang seragam untuk nilai-nilai umum di seluruh sistem. Ini memiliki beberapa kelebihan, terutama dengan nilai-nilai yang tidak biasa tetapi sesuatu yang mendasar seperti nol hanya sepadan dengan kasus caching sebelumnya.
Jenis pemaksaan (kemungkinan besar)
Pengembang asli berupaya untuk memaksa tipe primitif tertentu untuk memastikan bahwa perbandingan dilakukan pada tipe yang benar dan mungkin ke skala tertentu (jumlah tempat desimal). Ini OK, tetapi nama sederhana "nol" mungkin tidak cukup detail untuk kasus penggunaan ini dengan ZERO_1DP sebagai ekspresi maksud yang lebih tepat.
sumber
typedef
akan membuat tipe variabel tepat satu tempat dan memungkinkan mengubahnya tanpa harus mengubah kode.0.0f
.byteVar1 = byteVar2 Or CB128
sepertinya sedikit lebih baik daripadabyteVar1 = byteVar2 Or CByte(128)
. Tentu saja, memiliki akhiran numerik yang tepat untuk byte akan lebih baik. Karena C # mempromosikan operan bitwise ke operatorint
bahkan ketika hasilnya dijamin sesuai denganbyte
, masalah tidak begitu relevan di sana.Itu karena "Tooling Nagging"
Kemungkinan alasan yang tidak saya lihat tercantum di sini adalah karena banyak alat berkualitas menandai penggunaan angka ajaib . Seringkali merupakan praktik yang buruk untuk memiliki angka ajaib yang dilemparkan ke dalam algoritma tanpa membuatnya terlihat jelas untuk perubahan nanti, terutama jika mereka digandakan di beberapa tempat dalam kode.
Jadi, walaupun alat ini benar dalam menandai masalah seperti itu, mereka sering menghasilkan positif palsu untuk situasi di mana nilai-nilai ini tidak berbahaya dan kemungkinan besar bersifat statis, atau hanya menjadi nilai inisialisasi.
Dan ketika itu terjadi, kadang-kadang Anda menghadapi pilihan:
Tentang Kinerja
Tergantung pada bahasa saya kira, tetapi ini cukup umum di Jawa dan tidak memiliki dampak kinerja, karena nilai-nilai yang diuraikan pada waktu kompilasi jika mereka adalah konstanta nyata
static final
. Ini tidak akan berdampak pada C atau C ++ jika mereka dinyatakan sebagai konstanta atau bahkan sebagai makro pra-prosesor.sumber
Ini mungkin masuk akal karena secara eksplisit didefinisikan
Zero
sebagai tipefloat
.Setidaknya dalam C dan C ++ nilainya
0.0
bertipedouble
, sedangkan yang setarafloat
adalah0.0f
. Jadi dengan asumsix
Anda membandingkan terhadap juga selalufloat
mengatakansementara benar-benar mempromosikan
x
untukdouble
mencocokkan jenis0.0
yang dapat menyebabkan masalah (dengan tes kesetaraan khususnya). Perbandingan tanpa konversi tentunyayang melakukan hal yang sama seperti
Namun demikian, saya pikir akan jauh lebih berguna untuk mengaktifkan peringatan konversi di kompiler daripada meminta pengguna menulis kode yang aneh.
sumber
Pertama-tama, di sini nol didefinisikan sebagai
float
, bukanint
. Tentu saja, ini tidak mempengaruhi apa pun dalam perbandingan, tetapi dalam kasus lain ketika konstanta ini digunakan, itu mungkin membuat perbedaan.Saya tidak melihat alasan lain mengapa
Zero
dinyatakan konstan di sini. Ini hanya beberapa gaya pengkodean, dan lebih baik untuk mengikuti gaya jika digunakan di tempat lain dalam program tertentu.sumber
Ini hampir pasti sama efisiennya selama eksekusi (kecuali jika kompiler Anda sangat primitif) dan sedikit kurang efisien selama kompilasi.
Mengenai apakah itu lebih mudah dibaca daripada
x > 0
... ingat bahwa ada orang-orang yang jujur, dengan tulus, berpikir bahwa COBOL adalah ide bagus dan kesenangan untuk bekerja dengan - dan kemudian ada orang yang berpikir persis sama tentang C. (Rumor memiliki bahwa bahkan ada beberapa programmer dengan pendapat yang sama tentang C ++!) Dengan kata lain, Anda tidak akan mendapatkan kesepakatan umum tentang hal ini, dan mungkin tidak layak diperebutkan.sumber
Jika Anda menulis kode generik (yaitu non-tipe-spesifik), maka sangat mungkin. Suatu
zero()
fungsi dapat berlaku untuk semua jenis aljabar, atau jenis apa pun yang merupakan penambahan grup. Ini bisa berupa bilangan bulat, bisa berupa nilai titik-mengambang, bahkan bisa menjadi fungsi jika variabel Anda, katakanlah, itu sendiri adalah fungsi dalam beberapa ruang linear (mis. X adalah fungsi linear dari bentuk z -> a_x * z + b_x) dan kemudianzero()
menyediakan fungsi dengan a dan b keduanyazero()
dari jenis yang mendasarinya.Jadi Anda akan mengharapkan kode seperti itu, katakanlah, C ++ mungkin (meskipun
zero()
AFAIK tidak terlalu umum), atau di Julia, dan mungkin bahasa lain.sumber