Es cierto que cada maestrillo tiene su librillo, y que cada cual pica código como mejor le huele o más bonito le parece.
En mi caso, entre las múltiples manías que tengo cuando me pongo la gorra de programador, está la de que nunca, nunca permitir que un método devuelva un valor nulo.
Una de ejemplos
Así por ejemplo, voy a crear una estructura simple para un objeto del tipo persona.
public class Persona { public string Nombre { get; set; } public int Edad { get; set; } }
Y voy a escribir un pequeño modelo que, si le paso el nombre adecuado me devuelve una Persona con los datos completados.
public class Modelo { public Persona GetPersonaByName(string nombre) { if (nombre == "pepe") { return new Persona { Nombre = nombre, Edad = 14 }; } else { return null; } } }
Ahora creo un Test en donde compruebo que si le paso pepe, me devuelve una persona llamada pepe.
[TestMethod] public void GetPersonaByName_con_pepe_devuelve_pepe() { var modelo = new Modelo(); var persona = modelo.GetPersonaByName("pepe"); Assert.AreEqual("pepe", persona.Nombre); }
Ahora voy a jugar un poco. Si en vez de mandarle pepe, le mando ramón, este segundo test no va a pasar porque me va a dar un error de referencia nula.
[TestMethod] public void GetPersonaByName_con_ramon_devuelve_string_empty() { var modelo = new Modelo(); var persona = modelo.GetPersonaByName("ramon"); Assert.AreEqual("ramon", persona.Nombre); }
Asi qué voy a modificar el modelo para que no me "rompa" el código.
public class Modelo { public Persona GetPersonaByName(string nombre) { Persona persona = new Persona(); if (nombre == "pepe") { persona = new Persona { Nombre = nombre, Edad = 14 }; } return persona; } }
El problema es que ahora no me lanza ninguna excepción, pero si me avisa que la propiedad Nombre es null, lo cual me sigue pareciendo feo y me puede dar un error de referencia nula si quiero utilizar este valor en otra operación.
Así que ahora modifico el constructor de la clase Persona para inicializar las propiedades y darle un valor por defecto.
public class Persona { public string Nombre { get; set; } public int Edad { get; set; } public Persona() { Nombre = string.Empty; Edad = 0; } }
Y así si lanzo el test, no me encontraré con ningún nulo en ninguno de los ambos. Pero... y si le mando un null como parámetro?
[TestMethod] public void GetPersonaByName_con_null_devuelve_string_empty() { var modelo = new Modelo(); var persona = modelo.GetPersonaByName(null); Assert.AreEqual(string.Empty, persona.Nombre); }
En la primera aproximación me hubiera dado una excepción, pero como he protegido el código de la devolución de null, simplemente me devolverá un objeto Persona con los datos de inicialización por defecto.
Y esto, que en este código se podría obviar sin problemas, cuando tienes miles o cientos de miles de líneas, te puede salvar - como a mí - de "petes" tremendos y difíciles de localizar.
Espero que te sea de ayuda.