Perché questi errori sono così comuni e cosa possiamo fare per prevenirli?


20

Sembra che gli errori off-by-one siano uno degli errori di programmazione più comuni (se non il più comune) (vedi /software/109/what-are-common-mistakes-in-coding e saggezza convenzionale).

Qual è la ragione per cui sono così comuni, ha a che fare con il modo in cui funziona il cervello umano?
Cosa possiamo fare per evitare di cadere preda di un errore?


8
Sono comuni? Sto producendo la mia giusta dose di bug, ma gli errori off-by-one sono molto raramente tra questi. Forse perché uso principalmente Python, ovvero uso iteratori invece di giocoleria con indici? (E: cosa ci dice questo?;))

Meno devi pensare, più produttivo sei?
Malfist,

@delnan: sono d'accordo. Gli errori off-by-one sono in genere i primi ad essere rilevati quando sto programmando (prima ancora di passare a una "fase di test" ufficiale).
FrustratedWithFormsDesigner,

7
Ho quasi risposto alla domanda precedente per errore ...
DevSolo,

> Cosa possiamo fare per evitare di cadere preda di un errore? Usa un iteratore .
Jim G.

Risposte:


18

In un certo senso ha a che fare con il funzionamento del cervello umano. Siamo cablati per essere "abbastanza buoni" per attività che di solito non richiedono precisione di livello tecnico. C'è un motivo per cui i casi che incontriamo più problemi sono chiamati casi "limite".

Probabilmente il modo migliore per evitare errori off-by-one è l'incapsulamento. Ad esempio, invece di utilizzare un ciclo for che esegue l'iterazione di una raccolta per indice (da 0 a contare - 1), utilizzare un ciclo di stile for-each con tutta la logica di dove interrompere incorporato nell'enumeratore. In questo modo devi solo correggere i limiti una volta, quando scrivi l'enumeratore, anziché ogni volta che esegui il ciclo sulla raccolta.


6
+1 per l'incapsulamento. I peggiori bug off-by-one che io abbia mai visto sono quando parte del programma è basata su 1 e parte basata su 0, e ogni singola funzione che viene utilizzata, devi ricordare quale era e se devi fai la conversione o no e quale direzione prendere. Un paio di mesi fa ho dovuto rintracciare un errore off-by- 2 difficile perché l'incapsulamento scadente significava che qualcuno ha commesso errori off-by-1 in due punti di composizione separati. Ci sono state conversioni in tutto il luogo che erano impossibili da seguire e sono stato in grado di ottenere una conversione in un metodo.
Karl Bielefeldt,

2
Mi piacerebbe saperne di più sulla scienza di questo se qualcuno ha più informazioni. Penso anche che questo sia il motivo per cui lo stile programmatico, come i CSS, è così frustrante dove tutto è contorto ...
Azienda Laser

7

C'è qualcosa di speciale su come il cervello gestisce bordi e bordi.

Mentre è più facile per il cervello pensare in termini di distanze e spazi , concentrarsi su un bordo sembra richiedere un po 'più di attenzione. Ecco come succede, perdita momentanea di attenzione o concentrazione insufficiente e hai perso il confine.

Un'altra leggera aggiunta al problema è che diversi ambienti di programmazione hanno diversi sistemi di indicizzazione a partire da 0 o 1, il che potrebbe aggiungere confusione alle persone attivamente esposte a entrambi i tipi di ambienti.


4

Credo che sia dovuto al cambio di contesto. Nella nostra vita quotidiana tendiamo ad usare indici basati su 1. Per questo motivo il nostro cervello non è in grado di bruciare il comportamento corretto nella memoria a lungo termine.


2
E poi c'è il divertimento di passare da un linguaggio di programmazione a un indice DO che inizia da 1 (come PL / SQL).
FrustratedWithFormsDesigner,

3
+1 per quello. La numerazione a 1 indice risponde alla domanda "quanti ce ne sono?", Che si adatta perfettamente alla maggior parte delle attività del mondo reale. 0 indicizzato riguarda "in quale posizione si trova ogni elemento?", Che è di minore utilità nello spazio di meats.
Dan Ray,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.