Estoy un poco en desacuerdo con un desarrollador más experimentado en este tema, y me pregunto qué piensan los demás al respecto; nuestro entorno es Java, EJB 3, servicios, etc.
El código que escribí llama a un servicio para obtener cosas y crear cosas. El problema con el que me encontré fue que obtuve excepciones de puntero nulo que no tenían sentido. Por ejemplo, cuando le pido al servicio que cree un objeto, me devuelve el valor nulo; cuando intento buscar un objeto con una identificación válida conocida, me devuelve el valor nulo. Pasé algún tiempo tratando de descubrir qué estaba mal en mi código; Como tengo menos experiencia, por lo general asumo que he hecho algo mal, pero resulta que la razón de los retornos nulos fue la seguridad. Si el usuario principal que usa mi servicio no tenía los permisos correctos para el servicio de destino, entonces simplemente devuelve nulo. La mayoría de los otros servicios aquí tampoco están bien documentados, por lo que aparentemente esto es algo que debe saber.
Esto es bastante confuso como un desarrollador que escribe código que interactúa con el servicio. Tendría mucho más sentido para mí si el servicio fuera una excepción que me dijera que el usuario no tenía los permisos adecuados para cargar esta cosa o crearla; Entonces sabría de inmediato por qué mi servicio no funcionaba como se esperaba.
El desarrollador más experimentado que escribió el servicio argumentó que pedir los datos no es una condición de error, y que las excepciones solo deben generarse en una condición de error, no cuando el usuario no tiene acceso a los datos. Estos datos a menudo se buscan en una GUI, y para aquellos usuarios sin los permisos correctos, estas cosas simplemente "no existen". En resumen: preguntar no está mal, por lo tanto, no hay excepción. Obtener métodos devuelve nulo porque para esos usuarios esas cosas "no existen". Los métodos de creación devuelven nulo cuando al usuario no se le permitió crear esa cosa.
¿Es esto normal y / o buena práctica? Prefiero usar excepciones porque me resulta mucho más fácil saber qué está pasando. Entonces, por ejemplo, también preferiría lanzar una NotFoundException si solicitó un objeto con una ID no válida, en lugar de devolver nulo.