Cuando ¿Debería protegerme de argumentos nulos?
Supongo que está hablando de argumentos nulos pasados a métodos públicos o constructores de código que ha escrito. Tenga en cuenta que también es posible que tenga que "proteger" contra null cada vez que llame a una dependencia externa que pueda devolver nulo, a menos que su código pueda manejar esos casos con elegancia.
Debe evitar el valor nulo en cualquier método público (incluidos los constructores y los establecedores de propiedades) que expone a un usuario donde el valor nulo no tiene un significado útil y explícito. Si un valor nulo no significa algo especial para su código (por ejemplo, final de la matriz, "desconocido", etc.), entonces no debe aceptar ese valor, y debería arrojar un ArgumentNullException
en su lugar.
Esta regla no es exclusiva de null
tampoco. Siempre debe verificar los argumentos pasados a sus métodos públicos.
Por ejemplo, supongamos que está escribiendo algún tipo de método de servicio web que toma un ID de usuario y le hace algo a un usuario (por ejemplo, eliminarlos). Debes verificar que sea un ID de usuario válido antes de que tu método haga algo más con ese usuario. Otro ejemplo es si está escribiendo un método público que lleva un índice a una colección o matriz. Debe comprobar de antemano que el índice está dentro del rango permitido, que el índice no es más grande que la colección, o menor que cero.
También observo que las personas no están poniendo guardias en cosas como AsyncCallbacks.
Si usted sabe que su método de pre-condiciones se mantienen vigilantes por los argumentos que se pasan a los métodos (porque usted lanza excepciones si no lo son), entonces es libre para saltar estos controles en su privada e interna métodos, o clases privadas e internas.
Pero como ha señalado, debe tener cuidado de no confiar en ningún valor de retorno de una API que no haya escrito, o de que haya pasado algún valor en sus métodos de devolución de llamada. Trátelos como "sucios" y suponga que pueden ser valores nulos o no válidos.
que se pone muy hinchado y tediosa
Especificar y hacer el seguimiento de las condiciones previas para sus métodos públicos no es la hinchazón - se compila documentación. Es la forma de asegurarse de que su código es derecho. Así es como se les dice a los usuarios de su código por adelantado que hicieron algo mal. Permitir que esto falle en el medio de su método (o tal vez en otro método en alguna clase vagamente relacionada) hace que sea mucho más difícil depurar su problema.
Esto puede no parecer un gran problema ahora. Pero una vez que comienza a recibir las quejas de los clientes con un NullReferenceException
5 niveles por debajo de su pila, 20 llamadas a métodos más tarde, entonces creo que usted comenzará a ver los beneficios :)
Para evitar molestas otras personas con mucho de código unidiomático, ¿hay alguna norma aceptada en cuanto a dónde debo protegerme contra nulo?
Normalmente la gente escribe el código if ... throw
en la parte superior de su método. Esta es la sintaxis más idiomática, y muy fácil de entender incluso para principiantes. Más o menos parecidos a los parens en Lisp, una vez que se utiliza ese patrón, se puede rozar muy rápidamente, sin pensarlo.
Puede hacer que escribir estos controles sea más rápido usando Visual Studio Code Snippets.
Puede acortar un poco este código utilizando o creando algún código compartido que admita la sintaxis de aserción. En lugar de la sintaxis if ... throw
, escribiría una línea como Assert.NotNull(arg1, "arg1");
. Si desea algo de inspiración, puede consultar el NUnit del marco assertions y constraints.
Es posible que también desee consultar el Code Contracts API. Está diseñado para verificar condiciones previas, condiciones posteriores e invariantes (que son los nombres formales de estas "condiciones de guardia"). También puede mover parte de esta verificación del tiempo de ejecución al tiempo de compilación, para que pueda descubrir que ha cometido errores incluso antes de ejecutar su programa. Realmente no lo he visto, pero también podría darte una sintaxis más concisa. Editar: También vea Pencho Ilchev's answer para ver un pequeño ejemplo del uso de parte de esta API.
Los pongo en todas partes donde considero 'null' como un argumento inválido. –
Puede que le interese esta pregunta en el sitio hermano de los programadores: [¿Debería uno verificar nulo si no espera nulo?] (Http://programmers.stackexchange.com/questions/147480/should-one-check-for -null-if-he-does-not-expect-null/147483) – R0MANARMY
No parece ser un estándar. ¿Sería apropiado que alguien hiciera la pregunta wiki de la comunidad? –