Retrocedamos y usemos un ejemplo diferente que calcule la media aritmética de una matriz de valores.
Si la matriz de entrada está vacía (o nula), ¿puede cumplir razonablemente la solicitud de la persona que llama? No. ¿Cuáles son tus opciones? Bueno, podrías:
- presente / devolver / lanzar un error. usando la convención de su base de código para esa clase de error.
- documentar que se devolverá un valor como cero
- documento de que se devolverá un valor no válido designado (por ejemplo, NaN)
- documentar que se devolverá un valor mágico (p. ej., un mínimo o máximo para el tipo o algún valor indicativo de esperanza)
- declara que el resultado no está especificado
- declarar que la acción no está definida
- etc.
Les digo que les den el error si le han dado una entrada no válida y la solicitud no se puede completar. Me refiero a un error grave desde el primer día para que entiendan los requisitos de su programa. Después de todo, su función no está en condiciones de responder. Si la operación pudiera fallar (por ejemplo, copiar un archivo), entonces su API debería darles un error con el que puedan lidiar.
De modo que eso puede definir cómo su biblioteca maneja las solicitudes con formato incorrecto y las solicitudes que pueden fallar.
Es muy importante que su código sea coherente en la forma en que maneja estas clases de errores.
La siguiente categoría es decidir cómo su biblioteca maneja las solicitudes sin sentido. Volviendo a un ejemplo similar a la suya - Vamos a utilizar una función que determina si existe un archivo en una ruta: bool FileExistsAtPath(String)
. Si el cliente pasa una cadena vacía, ¿cómo maneja este escenario? ¿Qué tal una matriz vacía o nula pasada void SaveDocuments(Array<Document>)
? Decida su biblioteca / base de código, y sea coherente. Considero que estos casos son errores y prohíbo que los clientes realicen solicitudes sin sentido al marcarlos como errores (a través de una aserción). Algunas personas resistirán fuertemente esa idea / acción. Encuentro esta detección de errores muy útil. Es muy bueno para localizar problemas en los programas, con buena ubicación para el programa infractor. Los programas son mucho más claros y correctos (considere la evolución de su base de código), y no graben ciclos dentro de funciones que no hacen nada. El código es más pequeño / más limpio de esta manera, y las comprobaciones generalmente se envían a los lugares donde se puede presentar el problema.