Lo esencial si la pregunta parece ser "¿Cómo devuelvo dos datos no relacionados de un método que devuelve un solo int? Nunca quiero verificar mis valores de retorno, y los valores nulos son malos, no los use".
Veamos lo que quieres pasar. Está pasando una razón int o una razón no int de por qué no puede dar int. La pregunta afirma que solo habrá dos razones, pero cualquiera que haya hecho una enumeración sabe que cualquier lista crecerá. El alcance para especificar otras razones simplemente tiene sentido.
Inicialmente, entonces, parece que podría ser un buen caso para lanzar una excepción.
Cuando desea decirle a la persona que llama algo especial que no está en el tipo de retorno, las excepciones son a menudo el sistema apropiado: las excepciones no son solo para estados de error, y le permiten devolver una gran cantidad de contexto y justificación para explicar por qué simplemente puede No estoy hoy.
Y este es el ÚNICO sistema que le permite devolver entradas válidas garantizadas y garantizar que todos los operadores y métodos int que toman entradas pueden aceptar el valor de retorno de este método sin necesidad de verificar valores no válidos como valores nulos o mágicos.
Pero las excepciones son realmente solo una solución válida si, como su nombre lo indica, este es un caso excepcional , no el curso normal de los negocios.
Y un try / catch and handler es tan repetitivo como un cheque nulo, que fue lo que se objetó en primer lugar.
Y si la persona que llama no contiene el try / catch, entonces la persona que llama tiene que hacerlo, y así sucesivamente.
Un segundo paso ingenuo es decir "Es una medida. Las mediciones de distancia negativas son poco probables". Entonces, para algunas mediciones Y, solo puedes tener consts para
- -1 = desconocido
- -2 = imposible de medir,
- -3 = se negó a responder,
- -4 = conocido pero confidencial,
- -5 = varía según la fase lunar, ver tabla 5a,
- -6 = cuatro dimensiones, medidas dadas en el título,
- -7 = error de lectura del sistema de archivos,
- -8 = reservado para uso futuro,
- -9 = cuadrado / cúbico, entonces Y es igual a X,
- -10 = es una pantalla de monitor, por lo que no utiliza mediciones X, Y: utilice X como diagonal de la pantalla,
- -11 = escribió las medidas en el reverso de un recibo y se lavó en ilegibilidad, pero creo que eran 5 o 17,
- -12 = ... entiendes la idea.
Esta es la forma en que se hace en muchos sistemas C antiguos, e incluso en sistemas modernos donde hay una restricción genuina para int, y no se puede ajustar a una estructura o mónada de algún tipo.
Si las mediciones pueden ser negativas, simplemente aumenta el tipo de datos (por ejemplo, int largo) y hace que los valores mágicos sean más altos que el rango de int, e idealmente comience con algún valor que se muestre claramente en un depurador.
Sin embargo, hay buenas razones para tenerlos como una variable separada, en lugar de solo tener números mágicos. Por ejemplo, mecanografía estricta, mantenibilidad y conforme a las expectativas.
En nuestro tercer intento, entonces, observamos casos en los que es normal que los negocios tengan valores no int. Por ejemplo, si una colección de estos valores puede contener múltiples entradas no enteras. Esto significa que un controlador de excepciones puede ser el enfoque incorrecto.
En ese caso, parece un buen caso para una estructura que pasa el int y la justificación. Nuevamente, esta justificación puede ser una constante como la anterior, pero en lugar de mantener ambas en el mismo int, las almacena como partes distintas de una estructura. Inicialmente, tenemos la regla de que si se establece la justificación, no se establecerá el int. Pero ya no estamos atados a esta regla; También podemos proporcionar fundamentos para números válidos, si es necesario.
De cualquier manera, cada vez que lo llame, todavía necesita repetitivo, para probar la justificación para ver si el int es válido, luego retire y use la parte int si la justificación nos lo permite.
Aquí es donde debe investigar su razonamiento detrás de "no usar nulo".
Al igual que las excepciones, nulo significa un estado excepcional.
Si una persona que llama está llamando a este método e ignorando completamente la parte "racional" de la estructura, esperando un número sin ningún manejo de errores, y obtiene un cero, entonces manejará el cero como un número, y estará equivocado. Si obtiene un número mágico, lo tratará como un número y se equivocará. Pero si se anula, se caerá , como debería hacerlo.
Por lo tanto, cada vez que llame a este método, debe realizar comprobaciones de su valor de retorno; sin embargo, maneja los valores no válidos, ya sea dentro o fuera de banda, try / catch, verificando la estructura para un componente "racional", verificando el int para un número mágico, o buscando un int para un nulo ...
La alternativa, para manejar la multiplicación de una salida que puede contener un int inválido y una justificación como "Mi perro se comió esta medida", es sobrecargar el operador de multiplicación para esa estructura.
... Y luego sobrecargue a cualquier otro operador en su aplicación que pueda aplicarse a estos datos.
... Y luego sobrecargue todos los métodos que puedan tomar ints.
... Y todas esas sobrecargas aún deberán contener comprobaciones de entradas inválidas, solo para que pueda tratar el tipo de retorno de este método como si siempre fuera un int válido en el momento en que lo llama.
Entonces, la premisa original es falsa de varias maneras:
- Si tiene valores no válidos, no puede evitar verificar esos valores no válidos en cualquier punto del código donde maneja los valores.
- Si está devolviendo algo que no sea un int, no está devolviendo un int, por lo que no puede tratarlo como un int. La sobrecarga del operador le permite simular , pero eso es solo simular.
- Un int con números mágicos (incluidos NULL, NAN, Inf ...) ya no es realmente un int, es una estructura de pobre.
- Evitar los valores nulos no hará que el código sea más robusto, solo ocultará los problemas con ints o los moverá a una estructura compleja de manejo de excepciones.