Nilai default - apakah itu baik atau jahat?

12

Pertanyaan tentang nilai default secara umum - nilai fungsi pengembalian default, nilai parameter default, logika default untuk saat ada sesuatu yang hilang, logika default untuk menangani pengecualian, logika default untuk menangani kondisi tepi dll.

Untuk waktu yang lama saya menganggap nilai default sebagai hal "kejahatan murni", sesuatu yang "menyelubungi bencana" dan menghasilkan bug yang sangat sulit ditemukan. Tetapi baru-baru ini saya mulai berpikir tentang nilai-nilai default sebagai semacam hutang teknis ... yang bukan merupakan hal buruk langsung tetapi sesuatu yang dapat memberikan beberapa "pembiayaan jangka pendek" membuat kita bertahan dari proyek (berapa banyak dari kita mampu membayar untuk membeli rumah tanpa mengambil hipotek?).

Ketika saya mengatakan "jangka pendek" - maksud saya bukan - "lakukan sesuatu dengan cepat terlebih dahulu dan lakukan refactor sebelum nanti mengenai produksi". Tidak - Saya sedang berbicara tentang mengandalkan nilai-nilai standar yang di-hardcoded dalam perangkat lunak produksi. Memang - itu dapat menyebabkan beberapa masalah, tetapi bagaimana jika itu hanya akan menyebabkan satu masalah dalam satu tahun penuh.

Lagi - saya berbicara tentang perangkat lunak utama "rata-rata" di sini (bukan perangkat lunak untuk pembangkit tenaga nuklir) - situs web rata-rata atau aplikasi UI untuk perangkat lunak akuntansi, yang berarti bahwa nyawa orang tidak dipertaruhkan, atau jutaan dolar .

Sekali lagi, dari pengalaman saya, pengguna bisnis lebih suka hidup dengan perangkat lunak yang "berfungsi entah bagaimana", daripada menunggu yang sempurna. Dan penggunaan nilai default sangat membantu jika Anda mengembangkan perangkat lunak dengan gaya RAD. Tetapi sekali lagi - sesi debug terlama yang saya habiskan adalah karena bug yang diperkenalkan oleh nilai default yang baik berhenti menjadi "default" di sepanjang jalan atau karena subsistem kecil baru-baru ini ditingkatkan dan sebagai hasil dari upgrade ini itu tidak menangani default dengan benar (mis. daftar kosong vs nol, atau string nol vs string kosong).

Jadi pertanyaan saya adalah - apakah nilai default baik atau buruk. Dan jika itu adalah hutang teknis - bagaimana mengukur seberapa banyak Anda dapat meminjam sehingga Anda mampu membayar kembali?

Sangat menghargai masukan apa pun.

Bersulang.

EDIT:

Jika saya menggunakan nilai default sebagai cara untuk memotong sudut selama pengembangan - dan jika sudut memotong menghasilkan bug dan masalah - apa metodologi untuk pulih dari masalah ini?


sumber

Jawaban:

23

Konsep Convention over Configuration tidak mungkin tanpa nilai default yang masuk akal . Kata kuncinya di sini adalah "masuk akal". Nilai default harus masuk akal untuk setidaknya 80% (jika tidak lebih) dari semua penggunaan perpustakaan / layanan / kerangka kerja.

Aturan umum:

  • Jika nilai masuk akal untuk penggunaan 80% atau lebih, itu harus menjadi nilai default
  • Jika tidak ada nilai yang digunakan untuk sebagian besar kasus, jangan gunakan default.
  • Nilai default mencegah kesalahan bodoh dari kode pengaturan. Jika standarnya masuk akal untuk sebagian besar kasus, lebih sedikit orang yang mengacaukan konfigurasi yang berfungsi.
  • Konfigurasi non-standar lebih terlihat ketika Anda menggunakan default.
  • Bad default lebih buruk daripada tidak ada default.

Pada dasarnya, setelah Anda mempelajari cara kerja konfigurasi default, Anda dapat membuat keputusan cerdas tentang bagaimana / kapan melakukan konfigurasi non-standar.

Berin Loritsch
sumber
Terima kasih telah mengarahkan saya ke konsep "Convention over Configuration". Saya memang menggunakannya tanpa sadar memiliki nama. Bisakah Anda menjelaskan aturan ini: "Konfigurasi non-standar lebih terlihat ketika Anda menggunakan default." silahkan.
3
@Andrew Jika ada selusin panggilan ke Foo()dan satu panggilan ke Foo("bar"), satu panggilan cenderung menonjol dan karenanya lebih terlihat.
Matthew Scharley
1
Benar, dan jika sebagian besar penggunaan layanan FTP gunakan new FtpService()yang menetapkan port alternatif akan menonjol ( service.SetPort(12345)).
Berin Loritsch
43

Ambil contoh perpustakaan yang mengimplementasikan protokol FTP. Secara default FTP diharapkan beroperasi pada port 21. Sekarang saya akan sangat jengkel jika saya harus menentukan untuk menggunakan port 21 setiap kali saya membangun objek dari kelas FTP acak. Jika saya memerlukan port lain, izinkan saya menentukan.

Defaultnya baik-baik saja ketika itu adalah default waras.

Htbaa
sumber
21
+1. Kapan terakhir kali Anda mengetik di http://programmers.stackexchange.com:80/questions/?sort=newest&pagesize=50bilah alamat?
Jörg W Mittag
1
Jadi, bagaimana Anda mengukur / memperkirakan / mempengaruhi tingkat kewarasan dari variabel default.
5
Berapa lama untuk memikirkan nilai default yang masuk akal.
Alexander Gessler
1
@Andrew, lihat jawaban saya di bawah ini. Jika nilai baik untuk penggunaan 80% atau lebih, itu adalah standar yang baik.
Berin Loritsch
2
@Berin Loritsch: Jika nilai default digunakan untuk gagal dengan aman, Anda bisa berargumen bahwa itu baik meskipun hanya digunakan 1% dari waktu.
oosterwal
18

Anda mungkin menggunakan tata letak keyboard default dengan pemetaan tombol default, pemetaan tombol mouse default, browser default, mengetik bahasa standar sistem, booting dari OS default di boot loader, menu posisi default, skema warna default, font default lebar / tinggi / wajah / gaya, set karakter default, resolusi monitor default, default ... Anda mendapatkan ide.

Tetapi dalam semua keseriusan, saya pikir kekhawatiran yang Anda hadapi bukan dengan default tetapi dengan sesuatu yang lain. Perilaku default tidak menutupi bug secara inheren. Sebagian besar waktu kode Anda akan berjalan dalam kondisi umum, terlepas dari apakah Anda menetapkan default atau tidak. Case edge yang tidak tertangani adalah hal-hal yang Anda ingin pastikan untuk Anda hindari terlepas (mungkin melalui pengujian yang memadai dan tepat), karena ketika default diubah atau skenario yang tidak biasa terjadi.

Juga, penanganan pengecualian "tangkap semua" bisa dibilang cacat desain daripada apa pun yang Anda sebut "default".

Rei Miyasaka
sumber
OK, "tangkap semua" sebenarnya adalah contoh yang bagus. Ya - itu menyebabkan banyak kesedihan ketika suatu hari ada sesuatu yang salah karena alasan yang tidak diketahui, dan "seseorang" ini tidak diketahui sebagian besar karena pengecualian yang sebenarnya hilang dalam blok tangkapan semua. Jadi itu adalah hal yang buruk - bukan? Di sisi lain - tanpa blok tangkap-semua perangkat lunak bisa mati seketika (jika pengecualian tidak ditangani) atau akan memerlukan logika penanganan kesalahan yang rumit (setidaknya itu harus mencatat pengecualian dan menginisialisasi beberapa data dengan nilai dasar).
Jadi untuk menambah pertanyaan awal saya - jika saya menggunakan nilai default sebagai cara untuk mengambil jalan pintas selama pengembangan - dan jika sudut memotong menghasilkan bug dan masalah - apa cara terbaik untuk pulih dari masalah ini?
1
Sejauh pengecualian berjalan, ada artikel yang mengatakan harus ada satu pengecualian menangkap semua per thread , jika ada sama sekali. Ini akan digunakan untuk pelaporan kesalahan, jadi Anda melihat program sebagai "hal" tunggal dengan cara yang sama dengan OS dalam melihat suatu proses. Karena Anda memiliki pengguna akhir (dan semoga pengembang) di loop, Anda sebenarnya tidak "menelan" pengecualian - jadi semuanya baik-baik saja. Artikel di sini: codeproject.com/KB/architecture/exceptionbestpractices.aspx
Rei Miyasaka
1
Sedangkan untuk menggunakan default untuk menghindari bug - bagaimana dengan menggunakan komentar yang konsisten yang dapat Anda kontrol + f / mac + f untuk? Misalnya, Visual Studio benar-benar menunjukkan komentar yang dimulai dengan TODO: or TEMP:dalam daftar tugas. Jika saya memotong sudut demi pengembangan, saya mencoba untuk sangat berhati-hati untuk memastikan saya menempatkan TODO di sana - kemudian, sesekali, saya akan melakukan "menemukan semua" untuk kembali dan memastikan tidak ada yang masuk ke bangunan penting.
Rei Miyasaka
Ups, maksud saya menggunakan nilai-nilai hard-kode untuk membantu pengembangan. Ngomong-ngomong, saya baru menyadari bahwa "nilai-nilai hard-coded" mungkin kata yang Anda cari, bukan "nilai default".
Rei Miyasaka
3

Default harus digunakan ketika mereka menyimpan pengguna atau pengembang dari melakukan tugas yang berulang. Mereka tidak boleh digunakan untuk menutupi kesalahan atau pengecualian. Ini bukan praktik buruk untuk menggunakannya untuk mencegah kesalahan, tetapi hanya selama pencegahan tidak menutupi sesuatu yang buruk terjadi. Nilai default adalah alat seperti yang lainnya. Digunakan dengan benar mereka dapat menghemat banyak sakit kepala dan waktu. Tidak digunakan dengan benar mereka dapat menjatuhkan seluruh rumah.

Joel Etherton
sumber
Agak seperti C ++ meniup seluruh kaki Anda ...
Mateen Ulhaq
1
@muntoo: Hei, Lisp memberi saya pincang di '03.
Joel Etherton
2

Penyebab utama masalah yang Anda sebutkan bukanlah nilai default per se, tetapi masalah integrasi karena perubahan kontrak antarmuka, kesalahpahaman interpretasi, dan / atau asumsi yang tidak valid. Pada dasarnya semua ini (contoh spesifik) tampaknya merupakan hasil dari komunikasi yang tidak tepat - antara klien dan pengembang, atau antara pengembang / tim yang berbeda. Cukup adil, masalah ini dapat bermanifestasi sebagai nilai default tidak valid, tetapi juga dalam bentuk lain yang tak terhitung jumlahnya.

Tangani akar masalahnya, bukan gejalanya.

Dan perhatikan juga, bahwa - seperti yang ditunjukkan orang lain dengan contoh luar biasa - nilai default, bila digunakan secara bijak, dapat membuat kehidupan pengguna secara signifikan lebih mudah. Dan itu akhirnya tujuan kita, bukan?

Péter Török
sumber
"Komunikasi yang tidak benar" bisa menjadi penyebab utama, tetapi bukankah akar penyebab untuk banyak hal? Dan karena "tujuan akhir saya" adalah untuk memberikan perangkat lunak yang "cukup baik" tepat waktu di lingkungan dengan biaya terbatas, saya ingin tahu cara memberi tahu standar buruk / jahat dari yang baik.
@Andrew, komunikasi (atau ketiadaannya) adalah faktor utama dalam keberhasilan / kegagalan suatu proyek, tetapi jauh dari menjadi satu-satunya. Namun, ketika itu adalah pelakunya, itu harus ditangani dengan benar, jika tidak proyek Anda hampir pasti hancur. Saya tidak tahu ada alat ajaib untuk memisahkan default buruk dari yang baik: IMHO membutuhkan analisis yang cermat dari domain masalah, kasus penggunaan dll. Dan, yah, banyak komunikasi.
Péter Török
0

Nilai-nilai standar yang bukan bagian dari protokol / konvensi komunikasi adalah jahat. Dengan menjadi "bukan bagian" Maksudku, mereka tidak didokumentasikan di mana protokolnya ketat, atau mereka tidak diharapkan, di mana protokolnya longgar.

Jika nilai default didokumentasikan / diharapkan, itu masih bisa jahat, tetapi juga bisa menyelamatkan nyawa. Itu tergantung pada area domain. Sangat sering ketika mereka bisa sangat berbahaya (mis. Dosis obat standar, lantai lift default, arah gerakan mobil standar), dan kadang-kadang bisa berbahaya tidak memilikinya (mis. Arah gerakan mobil default, waktu rapat default).

astef
sumber