Estos días he leído código C# de varias personas y me ha resultado curioso cómo la gente sigue usando lo que aprendió hace años aun a pesar de que las cosas han cambiado. Os pongo el siguiente ejemplo:
Se dispone de una colección (_modules) de objetos Module y se necesita un método que retorne el único módulo que tenga por nombre el string que se le pasa.
public Module GetModulesCalled(string name)
{
for (int i = 0; i < _modules.Count; i++)
if (_modules[i].Name == name)
return modules[i];
return null;
}
Que retorne null si no encuentra coincidencia me parece muy bien. Lo que no me parece bien es que no mire si más de un módulo tiene el mismo nombre. Lo apropiado sería lanzar una excepción, pero claro, el código se volvería un poco más engorroso:
public Module GetModulesCalled(string name)
{
bool found = false;
Module toRet = null;
for (int i = 0; i < _modules.Count; i++)
if (_modules[i].Name == name)
if (found)
throw new ArgumentException("Two or more modules have the name: " + name);
else
{
toRet = modules[i];
found = true;
}
return toRet;
}
Otra implementación me ha parecido un “quiero pero no sé como”:
public Module GerModuleCalled(string name)
{
var query = (from x in _modules where x.Name == name select x);
if (query.Count == 1)
return query.First();
return null;
}
Aquí se retornaría null tanto si no existe como si existe más de uno. No es que me guste mucho la idea, pero podría aceptarse. En cualquier caso, yo propongo esta otra alternativa que, creo, es bastante más simple:
public Module GetModuleCalled(string name)
{
return _modules.SingleOrDefault(x => x.Name == name);
}
En este caso se retorna null si no existe un módulo con ese nombre o una excepción si existe más de uno. Precisamente ese es el cometido de SingleOrDefault.
Y digo yo… si tan interesante es el hecho de que haya más de un módulo con el mismo nombre, ¿no sería mejor devolver un contador con el número de módulos con el mismo nombre, en vez de meter una excepción a calzador, porque las excepciones molan y son cool?
Mwahahahaha!!! (No, no hace falta que contestes… a estas horas, es por joder :-)