Errores sutiles: límites de arrays en programación

Fuentes: Index, Count, Offset, Size

Este artículo de TigerBeetle aborda un problema común en la programación: los errores relacionados con la indexación y los cálculos de límites de arrays. Estos errores, a menudo sutiles, pueden ser difíciles de detectar incluso en código bien tipado, ya que los tipos de datos, aunque útiles, tienen sus limitaciones. El autor, Matklad, describe cómo, a pesar de usar lenguajes con tipado estático, sigue cometiendo errores de tipeo y, más importante aún, errores relacionados con la manipulación de índices.

La solución propuesta no es una nueva tecnología, sino una convención de nombres consistente. El núcleo de esta convención radica en diferenciar claramente entre el índice (la posición de un elemento dentro de una colección) y el conteo (el número total de elementos en esa colección). Se utiliza index para referirse a la posición de un elemento específico, y count para representar el número total de elementos. Esta distinción es crucial porque el índice máximo válido en un array siempre es uno menos que el conteo (index < count). El uso consistente de estos términos en los nombres de las variables hace que las combinaciones incorrectas de índices y conteos sean más evidentes a simple vista, incluso para alguien que no conoce los detalles del código.

Además de index y count, se introduce el término size para referirse al tamaño en bytes de un bloque de memoria, especialmente cuando se trabaja con representaciones de bajo nivel (como []u8) y se necesita contrastar con la representación tipada ([]T). El término length se evita debido a su ambigüedad, ya que su significado varía entre lenguajes como Rust y Python.

El artículo ilustra esta convención con ejemplos de código de TigerBeetle, mostrando cómo la nomenclatura clara facilita la comprensión y la detección de errores potenciales. Se complementa con otras prácticas de codificación de TigerBeetle, como el uso de sufijos en los nombres de las variables (big endian naming) y la uniformidad en la longitud de los nombres duales (source/target). En resumen, aunque una simple convención de nombres no es una solución mágica, puede contribuir significativamente a la reducción de errores y a la mejora de la legibilidad del código, especialmente en contextos de programación de bajo nivel.