Mengapa ada satu kesalahan yang begitu umum dan apa yang bisa kita lakukan untuk mencegahnya?

20

Tampaknya kesalahan off-by-one adalah salah satu kesalahan pemrograman paling umum (jika bukan yang paling umum) (lihat /software/109/what-are-common-mistakes-in-coding , dan kebijaksanaan konvensional).

Apa alasan ini sangat umum, apakah ada hubungannya dengan cara kerja otak manusia?
Apa yang bisa kita lakukan untuk mencegah jatuh mangsa ke mati oleh satu kesalahan?

Malfist
sumber
8
Apakah ini biasa? Saya menghasilkan bug yang adil, tetapi kesalahan satu-per-satu jarang terjadi di antara mereka. Mungkin karena saya lebih banyak menggunakan Python, yaitu menggunakan iterators daripada juggling dengan indeks? (Dan: Apa artinya itu bagi kita
Semakin sedikit Anda harus memikirkan, semakin produktif Anda?
Malfist
@ Darnan: Saya setuju. Kesalahan satu per satu biasanya merupakan kesalahan pertama yang ditangkap saat saya melakukan pengkodean (bahkan sebelum saya pindah ke "fase pengujian" resmi).
FrustratedWithFormsDesigner
7
Saya hampir menjawab pertanyaan sebelumnya secara tidak sengaja ...
DevSolo
> Apa yang bisa kita lakukan untuk mencegah jatuh mangsa ke mati oleh satu kesalahan? Gunakan iterator .
Jim G.

Jawaban:

18

Semacam itu ada hubungannya dengan cara kerja otak manusia. Kami siap menjadi "cukup baik" untuk tugas-tugas yang biasanya tidak membutuhkan ketelitian tingkat teknik. Ada alasan mengapa kasus yang paling sulit kita tangani disebut kasus "tepi".

Mungkin cara terbaik untuk menghindari kesalahan satu per satu adalah enkapsulasi. Misalnya, alih-alih menggunakan loop untuk yang mengulang koleksi dengan indeks (dari 0 hingga hitungan - 1), gunakan loop gaya untuk-masing-masing dengan semua logika tempat berhenti dibangun ke enumerator. Dengan begitu Anda hanya perlu mendapatkan batas yang benar satu kali, saat menulis enumerator, bukan setiap kali Anda mengulang koleksi.

Mason Wheeler
sumber
6
+1 untuk enkapsulasi. Bug off-by-one terburuk yang pernah saya lihat adalah ketika bagian dari program berbasis 1 dan sebagian berbasis 0, dan setiap fungsi tunggal digunakan, Anda harus mengingat yang mana itu dan apakah Anda harus lakukan konversi atau tidak dan ke arah mana harus pergi. Beberapa bulan yang lalu saya harus melacak kesalahan off-by- 2 yang sulit karena enkapsulasi yang buruk berarti seseorang membuat kesalahan off-by-1 di dua tempat peracikan terpisah. Ada konversi di semua tempat yang tidak mungkin untuk diikuti dan saya dapat menurunkannya ke satu konversi dalam satu metode.
Karl Bielefeldt
2
Saya ingin belajar lebih banyak tentang ilmu ini jika ada yang punya info lebih lanjut. Saya juga berpikir inilah sebabnya gaya pemrograman, seperti CSS, sangat menyebalkan di mana semuanya menjadi ujung ...
Company Laser
7

Ada sesuatu yang istimewa tentang bagaimana otak menangani batas dan tepi.

Meskipun lebih mudah bagi otak untuk berpikir dalam hal rentang dan ruang , fokus pada sisi tampaknya membutuhkan perhatian lebih. Inilah bagaimana ini terjadi, kehilangan perhatian sesaat atau konsentrasi yang tidak memadai dan Anda melewatkan perbatasan.

Tambahan kecil lain untuk masalah ini adalah bahwa lingkungan pemrograman yang berbeda memiliki sistem indeksasi yang berbeda mulai dari 0 atau 1 yang dapat menambah kebingungan bagi orang-orang yang secara aktif terpapar pada kedua jenis lingkungan.


sumber
4

Saya percaya ini karena pengalihan konteks. Dalam kehidupan kita sehari-hari kita cenderung menggunakan indeks berbasis 1. Karena itu otak kita tidak dapat membakar perilaku yang benar ke dalam memori jangka panjang.

Kekacauan Kekacauan
sumber
2
Dan kemudian ada kesenangan beralih antara bahasa pemrograman yang indeks DO mulai dari 1 (seperti PL / SQL).
FrustratedWithFormsDesigner
3
+1 untuk itu. Penomoran 1-indeks menjawab pertanyaan "ada berapa banyak?", Yang memetakan rapi untuk sebagian besar tugas dunia nyata. Diindeks 0 adalah tentang "di mana posisi setiap item?", Yang kurang digunakan di meatspace.
Dan Ray