Lo que más me molesta acerca de algunos lenguajes de programación (por ejemplo, C#, Javascript) es que al intentar acceder a una propiedad de null
se produce un error o una excepción.¿Por qué intentar acceder a una propiedad de null causa una excepción en algunos idiomas?
Por ejemplo, en el siguiente fragmento de código,
foo = bar.baz;
si la barra es null
, C# lanzará una desagradable NullReferenceException
y mi intérprete Javascript se quejará con Unable to get value of the property 'baz': object is null or undefined
.
puedo entender esto, en teoría, pero en el código real que a menudo tienen poco profundas objetos, como
foo.bar.baz.qux
y si alguno de entre foo
, bar
, o baz
es nulo, mis códigos se rompen. :(Además, si evalúo las siguientes expresiones en una consola, parece que hay inconsistencias en los resultados:.
true.toString() //evaluates to "true"
false.toString() //evaluates to "false"
null.toString() //should evaluate to "null", but interpreter spits in your face instead
I desprecian absolutamente escribir código para manejar este problema, porque siempre es prolijo, código hediondos La siguientes son ejemplos no artificiales, agarré estos de uno de mis proyectos (el primero es en Javascript, el segundo es en C#):
if (!(solvedPuzzles &&
solvedPuzzles[difficulty] &&
solvedPuzzles[difficulty][index])) {
return undefined;
}
return solvedPuzzles[difficulty][index].star
y
if (context != null &&
context.Request != null &&
context.Request.Cookies != null &&
context.Request.Cookies["SessionID"] != null)
{
SessionID = context.Request.Cookies["SessionID"].Value;
}
else
{
SessionID = null;
}
Las cosas serían mucho más fáciles si toda la expresión devolviera null
si alguna de las propiedades fuera nula. Los ejemplos de código anteriores podrían haber sido mucho más simples:
return solvedPuzzles[difficulty][index].star;
//Will return null if solvedPuzzles, difficulty, index, or star is null.
SessionID = context.Request.Cookies["SessionID"].Value;
//SessionID will be null if the context, Request, Cookies,
//Cookies["SessionID"], or Value is null.
¿Hay algo que me falta? ¿Por qué estos idiomas no usan este comportamiento en su lugar? ¿Es difícil de implementar por alguna razón? ¿Causaría problemas que estoy pasando por alto?
¿Es nulo un valor válido para todos esos valores en la cadena? Es más fácil simplemente no almacenar nulos allí en primer lugar. Entonces puedes evitar esos cheques por completo. –
Te va a encantar el [patrón de objeto nulo] (http://en.wikipedia.org/wiki/Null_Object_pattern) ... – fredoverflow
No es culpa del idioma que decidió tener una colección nula en lugar de una colección vacía .. – canon