Apakah ada keuntungan untuk mengkodekan nilai data ke dalam suatu program?

13

Saya seorang programmer otodidak, pemula-ish, jadi saya minta maaf jika saya tidak memaku istilah programmer.

Saya sedang mengerjakan proyek di mana saya memberikan data, yang akan terus diperbarui, untuk pengembang yang pada dasarnya akan membuat alat untuk menghasilkan laporan dari pertanyaan pada data.

Tampaknya semua orang yang terlibat berpikir bahwa mereka perlu meng-hard-data nilai data (bukan skema, tetapi domain / nilai sendiri) ke dalam program pembuatan laporan.

Sebagai contoh, misalkan kita melaporkan personil; laporan akan dibagi menjadi beberapa kategori, dengan tajuk untuk setiap departemen, dan kemudian di bawah masing-masing departemen tajuk akan menjadi subpos judul pekerjaan, dan kemudian di bawah setiap subpos akan ada daftar karyawan. Para pengembang ingin melakukan hard-code pada departemen dan jabatan pekerjaan. Di sisi lain, saya akan berpikir bahwa mereka dapat / akan menanyakan hal-hal tersebut pada saat runtime, mengurutkan catatan berdasarkan mereka, dan menghasilkan header laporan secara dinamis berdasarkan pada nilai-nilai apa yang ada.

Karena daftar nilai potensial akan berubah seiring waktu (mis. Departemen akan dibuat / diganti namanya, jabatan baru akan ditambahkan), kode ini perlu terus diperbarui. Sepertinya saya bahwa kami dapat melewati langkah-langkah pemeliharaan kode dan mengatur laporan secara dinamis.

Karena saya bukan pengembang, saya bertanya-tanya apa yang saya lewatkan. Apa keuntungan yang mungkin ada untuk nilai-nilai hard-coding ke alat seperti ini? Apakah ini biasanya bagaimana program dirancang?

Tom
sumber
Apakah tab silang laporan, nilai makna dalam baris akan muncul sebagai kolom?
Tulains Córdova
1
@Brendan - Jika Anda memberikan nilai kode dalam laporan, Anda harus mengubah daftar di DUA tempat (sumber data dan laporan) sedangkan jika laporan itu dinamis, Anda hanya perlu mengubahnya di satu lokasi (laporan) .
kwah
1
@ Brendan mengapa Anda berakhir di tiga lokasi? Mungkin pemahaman saya salah tetapi saya membayangkan permintaan sql untuk mengambil data dari database, aplikasi akan mengumpulkan / mengelompokkan nilai yang dikembalikan oleh, misalnya, departemen. Jika Anda ingin memiliki beberapa kueri db, Anda dapat memilih departemen / judul peran yang berbeda jika Anda benar-benar menginginkannya. Pada titik tidak ada data yang ada di lebih dari satu lokasi - laporan sedang didorong oleh data.
kwah
1
@ Brendan Saya juga tidak setuju dengan definisi Anda tentang keberadaannya di satu tempat - cara Anda menggambarkannya ada di beberapa lokasi, yang tersebar di seluruh kode sumber.
kwah

Jawaban:

9

Wikipedia:

Hard coding (juga hard-coding atau hardcoding) mengacu pada praktik pengembangan perangkat lunak yang menanamkan apa yang mungkin, mungkin hanya dalam retrospeksi, dianggap sebagai input atau data konfigurasi langsung ke kode sumber program atau objek yang dapat dieksekusi lainnya, atau pemformatan tetap dari data, bukannya memperoleh data itu dari sumber eksternal atau menghasilkan data atau memformat dalam program itu sendiri dengan input yang diberikan.

Hard-coding dianggap sebagai antipattern.

Dianggap sebagai anti-pola, pengkodean yang keras membutuhkan kode sumber program untuk diubah setiap kali input data atau format yang diinginkan berubah, ketika mungkin lebih nyaman bagi pengguna akhir untuk mengubah detail dengan beberapa cara di luar program.

Terkadang Anda tidak bisa menghindarinya tetapi itu harus sementara.

Pengkodean sering dibutuhkan. Programmer mungkin tidak memiliki solusi antarmuka pengguna yang dinamis untuk pengguna akhir bekerja tetapi masih harus memberikan fitur atau melepaskan program. Ini biasanya bersifat sementara tetapi tidak menyelesaikan, dalam arti jangka pendek, tekanan untuk mengirimkan kode. Kemudian, softcoding dilakukan untuk memungkinkan pengguna untuk menyampaikan parameter yang memberikan pengguna akhir cara untuk memodifikasi hasil atau hasil.

  • Hardcoding pesan membuatnya sulit untuk menginternasionalkan suatu program.
  • Jalur hardcoding menyulitkan untuk beradaptasi dengan lokasi lain.

Satu-satunya keuntungan dari hardcoding adalah pengiriman kode yang cepat.

Tulains Córdova
sumber
5
OK, tapi "satu-satunya keuntungan" sering kali sangat penting. Keputusan desain dalam pemrograman sering tentang pertukaran antara pemeriksaan di masa depan dan pengiriman cepat sekarang, dan dengan demikian, hard coding dapat menjadi pilihan yang bisa diterima. Terkadang pengkodean yang tidak sulit adalah pilihan desain yang buruk.
-1 Saya rasa ini bukan jawaban yang bermanfaat. Itu pada dasarnya mengatakan 'menanamkan nilai ke kode sumber tidak tepat' tidak pantas. Saya pikir OP ingin panduan tentang kapan hal-hal mungkin termasuk dalam kode sumber dan karena itu berada di luar definisi Wikipedia Anda.
Nathan Cooper
Pengkodean keras harus menjadi bagian penting dari proses Anda dan menganggapnya sebagai anti-pola sudah ketinggalan zaman di zaman layanan-mikro, dengan tutorial Angular Tour of Heroes menjadi contoh profil tinggi dari sebuah rumah perangkat lunak besar yang secara langsung mendukung atau bahkan memberi mandat sebagai langkah menengah. Terlebih lagi, ketika Anda pindah ke data dinamis Anda masih harus mempertahankan beberapa data kode keras sebagai back-back, mungkin dikendalikan oleh variabel lingkungan atau bahkan beralih boolean pada kode itu sendiri sehingga bug dan masalah keamanan dapat dengan baik diisolasi ke bawah. baris.
Apa yang ada di Google Search
24

Betulkah? Tidak Ada Kasus Penggunaan yang Valid?

Sementara saya setuju bahwa hard-coding umumnya anti-pola atau setidaknya bau kode yang sangat buruk , ada banyak kasus di mana masuk akal:

  • kesederhanaan ( YAGNI ),
  • input sebenarnya konstan dan tidak akan pernah berubah (yaitu mewakili konstanta alami atau bisnis atau perkiraan satu. misalnya 0, PI, ...),
  • perangkat lunak tertanam (batasan memori dan alokasi datang ke pikiran),
  • perangkat lunak yang aman (nilai-nilai ini tidak tersedia dan / atau mudah didekodekan atau direkayasa ulang, misalnya token dan garam kriptografis),
  • kode yang dihasilkan (preprocessor atau generator Anda dapat dikonfigurasi, tetapi mengeluarkan kode dengan nilai-nilai yang dikodekan),
  • dan mungkin beberapa lagi.

Masih Anti-Pola ? Begitu juga Over-Engineering ! Ini tentang Harapan Hidup Perangkat Lunak Anda !!

Bukannya saya mengatakan ada semua alasan bagus, dan umumnya saya menolak keras nilai-nilai yang dikodekan. Tetapi beberapa dapat dengan mudah mendapatkan izin karena alasan yang valid.

Dan jangan mengawasi yang pertama tentang kesederhanaan / YAGNI baik dengan berpikir itu sepele: mungkin tidak ada alasan untuk mengimplementasikan parser gila dan pemeriksa nilai untuk skrip sederhana yang melakukan satu pekerjaan untuk kasus penggunaan yang sempit dengan sangat baik.

Sulit untuk menemukan keseimbangan. Terkadang Anda tidak melihat bahwa suatu perangkat lunak akan tumbuh dan bertahan lebih lama daripada skrip sederhana yang dimulainya. Namun, seringkali sebaliknya: kita terlalu banyak merekayasa hal-hal, dan sebuah proyek ditangguhkan lebih cepat daripada yang dapat Anda baca dari Pragmatic Programmer. Anda menyia-nyiakan waktu dan usaha untuk hal-hal yang tidak dibutuhkan oleh prototipe awal.

Itulah hal-hal jahat dengan Anti-Pola: mereka hadir di kedua ujung spektrum, dan penampilan mereka tergantung pada sensitivitas orang yang meninjau kode Anda.

haylem
sumber
Itu lucu, karena saya mengujinya sendiri, dan itu jauh lebih mudah dan lebih cepat dan lebih bersih bagi saya untuk menangani nilai-nilai secara dinamis. Saya melakukannya dengan Python, sedangkan saya percaya produk akhirnya akan dikodekan di Jawa - jika ini membuat perbedaan. Rasanya terlalu direkayasa ketika saya menuliskan kode dalam nilai-nilai, karena setiap kolom yang masuk harus dilacak di beberapa tempat.
Tom
@ Tom: Anda mengatakan lebih mudah dan lebih cepat untuk mengimplementasikan (atau bahkan menggunakan kembali) pustaka pencarian konfigurasi daripada menggunakan nilai kode-keras? Bagus untukmu. Juga, saya tidak melihat bagaimana kalimat terakhir Anda sesuai dengan definisi over-engineering. Itu akan terasa jelas berantakan, dan jelas jika itu hard-coded dan digandakan itu bahkan lebih buruk (yang bukan poin dari pertanyaan pertanyaan Anda, saya mungkin salah paham, tetapi bagi saya sepertinya Anda maksudkan nilai itu bukan hard-coded di tempat setiap kali, tetapi dalam satu titik dalam program ini).
haylem
Ngomong-ngomong, saya hanya menunjukkan kasus-kasus yang valid. Saya juga menunjukkan bahwa itu akan menjadi kontroversial dalam kalimat terakhir saya. Anda tidak dapat menyenangkan semua orang dan tim memiliki orang-orang dengan berbagai tingkat keterampilan.
haylem
1
@ Tom, jangan menjual dirimu terlalu pendek. Anda pasti pada sesuatu. Kedengarannya lebih mudah dan lebih tidak memakan waktu untuk menulis algoritma cepat untuk mengatur data dengan melihat bidang Departemen dan Judul Pekerjaan sebagai lawan dari pengkodean keras Department = ['IT', 'Sales', 'Operations', 'HR', 'Finance']. Ini juga akan jauh lebih sulit untuk mempertahankan array kode keras dalam hal Departemen atau Judul baru diperkenalkan.
Chris G
1
Anda dapat memiliki hal-hal yang lebih kompleks yang masih masuk akal untuk hardcode. Salah satu yang terlintas dalam pikiran bahwa saya menulis beberapa tahun yang lalu adalah semua permutasi yang mungkin dari serangkaian nilai. Saya perlu menemukan arah yang valid acak, memilih permutasi acak dan kemudian mengambil hasil valid pertama sejauh ini merupakan solusi yang paling efisien dan karena itu dalam O (N ^ 3) efisiensi loop yang penting.
Loren Pechtel
4

Ada kalanya OK untuk nilai hard-code. Sebagai contoh, ada beberapa angka seperti 0, atau satu atau berbagai nilai n ^ 2-1 untuk bitmask yang perlu nilai tertentu untuk keperluan algoritmik. Mengizinkan nilai seperti itu ke yang dapat dikonfigurasi tidak memiliki nilai dan hanya membuka kemungkinan masalah. Dengan kata lain, jika mengubah nilai hanya akan merusak banyak hal, itu mungkin harus hardcoded.

Dalam contoh yang Anda berikan, saya tidak melihat di mana hard-coding akan berguna. Semua yang Anda sebutkan / seharusnya sudah ada di database termasuk pos. Bahkan hal-hal yang mendorong presentasi (seperti urutan pesanan) dapat ditambahkan jika tidak ada.

JimmyJames
sumber
Terima kasih. Urutan urutan adalah satu-satunya perhatian saya. Namun, dalam kasus kami itu tidak masalah, dan saya bahkan tidak menganggap itu bisa ditambahkan sebagai tabel lain dalam database.
Tom
1
Saya harus mencatat bahwa mengelola semua ini di DB adalah satu opsi. Anda juga dapat menggunakan file konfigurasi atau solusi lain tetapi hardcoding tampaknya menjadi pilihan yang buruk. Opsi DB sering digunakan karena mudah untuk membuat antarmuka untuk memungkinkan opsi dikelola oleh pengguna. Ada juga alat seperti ini yang dirancang khusus untuk tujuan ini.
JimmyJames
-1

Menerapkan solusi yang kuat yang memungkinkan untuk nilai-nilai yang mungkin telah dikodekan untuk dapat dikonfigurasi oleh pengguna akhir menuntut validasi kuat dari nilai-nilai tersebut. Apakah mereka memasukkan string kosong? Apakah mereka memasukkan sesuatu yang non-numerik di mana seharusnya angka? Apakah mereka melakukan injeksi SQL? Dll

Hard-coding menghindari banyak risiko ini.

Yang tidak mengatakan bahwa hard-coding selalu, atau bahkan sering, ide yang bagus. Ini hanyalah salah satu faktor yang perlu dipertimbangkan.

Eliot Topher
sumber