Saya sedang membaca artikel tentang praktik pemrograman yang buruk .
Itu disebutkan -
"Yo-Yo code" yang mengubah nilai menjadi representasi yang berbeda, lalu mengubahnya kembali ke tempat permulaannya (mis: mengubah desimal menjadi string dan kemudian kembali ke desimal, atau menambahkan string, lalu memangkasnya)
Saya tidak mengerti mengapa contoh khusus yang dia berikan adalah cara yang buruk untuk menulis program. Tampaknya baik-baik saja bagi saya untuk mengonversi kembali jika situasinya mengharuskannya sehingga nilainya dapat digunakan.
Adakah yang bisa menjelaskan lebih lanjut tentang ini?
programming-practices
anti-patterns
pengguna13107
sumber
sumber
"Roundabout code" that accomplishes in many instructions what could be done with far fewer (eg: rounding a number by converting a decimal into a formatted string, then converting the string back into a decimal)
.if the situation is so that they have to be used?
- situasi apa itu?decimal myValue = decimal.Parse(dataReader["myColumn"].ToString())
adalah kesal hewan peliharaan saya.Jawaban:
Bahkan jika Anda benar- benar membutuhkan representasi numerik dan string dari suatu angka, lebih baik mengonversi sekali saja dan juga berpegang pada nilai asli, alih-alih mengonversi lagi setiap kali Anda membutuhkan satu atau yang lainnya.
Prinsipnya adalah, seperti biasa, kode yang tidak ada tidak dapat memiliki cacat yang halus , sedangkan kode yang ada sering terjadi. Itu mungkin terdengar paranoid, tetapi pengalaman mengajarkan kita bahwa itu tepat. Jika Anda mendekati pemrograman dengan kecemasan ringan permanen tentang "Saya tidak cukup pintar untuk memahami sistem yang rumit ini", Anda berada di jalur yang benar.
sumber
Itu buruk karena tiga alasan utama:
Saya menduga alasan 1 adalah alasan yang dipikirkan sumber Anda berdasarkan konteks yang disebutkan.
sumber
Saya akan mengulangi deskripsi sebagai "kode yang mengubah tipe ke representasi yang berbeda untuk tujuan melakukan sesuatu yang bisa dilakukan dengan baik atau lebih baik dalam aslinya dan kemudian mengubahnya kembali. Ada banyak situasi di mana mengubah sesuatu menjadi sebuah tipe yang berbeda, menindaklanjutinya, dan mengubahnya kembali sepenuhnya tepat dan kegagalan untuk melakukannya akan menghasilkan perilaku yang salah.
Sebagai contoh di mana konversi baik:
Seseorang memiliki empat
float
nilai tanda arbitrer yang besarnya mungkin berbeda dengan faktor hingga 1.000, dan seseorang perlu menghitung jumlah dalam 0,625 unit di tempat terakhir. Mengubah keempat nilai menjadidouble
, menghitung penjumlahan, dan mengubah hasilnya kembalifloat
menjadi jauh lebih efisien daripada pendekatan apa pun yang menggunakanfloat
sendiri.Nilai titik-mengambang paling akurat hingga 0,5 unit di tempat terakhir (ULP). Contoh ini akan mengharuskan bahwa kesalahan pembulatan kasus terburuk tidak lebih dari 25% di atas kesalahan kasus terburuk optimal. Menggunakan ganda akan menghasilkan nilai yang akan akurat dalam 0,5001 ULP. Sementara persyaratan 0,625 ULP mungkin tampak dibuat-buat, persyaratan seperti itu sering penting dalam algoritme pendekatan-berturut-turut. Semakin ketat batas kesalahan ditentukan, semakin rendah persyaratan iterasi kasus terburuk.
Sebagai contoh di mana konversi buruk:
Seseorang memiliki angka floating-point, dan ingin menghasilkan string yang akan mewakili nilainya secara unik. Salah satu pendekatan adalah mengonversi angka menjadi string dengan jumlah digit tertentu, mencoba mengubahnya kembali, dan melihat apakah hasilnya cocok.
Tapi ini sebenarnya pendekatan yang buruk. Jika string desimal mewakili nilai yang berada hampir tepat di titik tengah antara dua nilai floating-point, itu cukup mahal untuk metode string-to-float untuk menjamin bahwa itu akan selalu menghasilkan semakin dekat
float
, dan banyak metode konversi seperti itu tidak dapat menegakkan jaminan seperti itu (antara lain, melakukan hal itu dalam beberapa kasus akan mengharuskan membaca semua digit angka, bahkan jika itu panjangnya miliaran digit).Jauh lebih murah untuk suatu metode untuk menjamin bahwa ia akan selalu mengembalikan nilai yang berada dalam 0,5625 unit di tempat terakhir (ULP) dari nilai yang diwakili. Rutin format desimal-ke-string yang kuat "reversibel" harus menghitung seberapa jauh nilai output dari nilai yang benar, dan terus mengeluarkan digit hingga hasilnya berada dalam 0,375 (ULP) jika tidak 0,25 (ULP). Jika tidak, ini dapat menghasilkan string yang beberapa metode konversi akan proses dengan benar, tetapi metode konversi lainnya tidak.
Lebih baik terkadang mengeluarkan angka yang mungkin tidak "perlu" daripada menghasilkan nilai yang mungkin disalahtafsirkan. Bagian kuncinya adalah bahwa keputusan berapa digit harus menjadi output harus dibuat berdasarkan perhitungan numerik yang terkait dengan proses output, bukan pada hasil dari upaya satu metode tertentu untuk mengubah string kembali ke angka.
sumber
Berbagai alasan
Tidak ada gunanya dan menambah kompleksitas - baik dalam jumlah kode untuk menulis dan memelihara, dan jumlah waktu CPU yang dibutuhkan
Itu bisa kehilangan akurasi atau lebih buruk, merusak nilainya sama sekali
Itu membuang-buang memori (berpotensi, tergantung pada bahasa) ketika Anda akhirnya menyimpan lebih banyak representasi dari nomor yang Anda butuhkan
Praktik yang baik hanya untuk menjaga representasi pertama, seakurat mungkin, untuk data apa pun yang Anda terima. Lakukan kalkulasi apa pun menggunakan data ini, dan hanya perlu mengonversinya jika Anda perlu menampilkan atau menampilkannya dalam format yang lebih mudah dibaca.
sumber
Mengapa? Karena bahkan yang terbaik dari kita dapat membuat kesalahan.
Lihat apa yang terjadi ketika Microsoft mencoba menerapkan format "pulang pergi" khusus untuk memastikan konversi string <-> float aman: https://stackoverflow.com/q/24299692/541686
sumber
Ketika saya masih di sekolah (dan pasca sekolah di bidang teknik listrik) kami diajarkan untuk membelah setelah mengalikan. Pembagian sering banyak digit dan bulat. Mengalikan setelah pembagian mengalikan kesalahan pembagian.
Jenis konversi sama, Anda berisiko kehilangan data. CInt (1.3) = 1.
Dalam bahasa saya, Basic, kami hanya melakukan konversi jenis (program VB6 menghabiskan 90% waktunya untuk melakukan konversi ANSI / Unicode, untuk semua panggilan API yang menghasilkan runtime).
Konversi tipe tersirat dalam semua yang kami lakukan.
String "5" akan dicetak dari literal numerik.
String unicode literal akan dikonversi menjadi string ANSI dan dikirim ke SetWindowsTextA oleh paket formulir.
Bahkan ini berfungsi di dasar
Saya seorang programmer varian hari ini - saya bahkan tidak berpikir tentang tipe. Saya hanya mengandalkan konversi otomatis.
Pokoknya 3 kencing kesayangan saya adalah
Menetapkan string literal ke variabel untuk menggunakannya (menghabiskan memori dan lambat)
Fungsi tidak berguna ketika kode bisa inline (dan kompiler mungkin akan membatalkan fungsi Anda dan tetap inline)
Menyetel semua objek menjadi nol sebagai baris terakhir sebelum Fungsi Akhir atau akhir program.
dan yang ke-4 untuk program pendek
Peredupan 3 variabel Anda secara sia-sia dalam program 5 baris.
sumber