La programación imperativa no siempre es más sencilla

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.

Por Carballude

Me llamo Pablo Carballude González, soy graduado en computación con master en HCI y Seguridad Informática. Actualmente trabajo para Amazon en Seattle como Software Developer Engineer. Soy de esas personas que no saben si los textos autobiográficos deben ser en primera o tercera persona. Lo intenté en segunda, pero no le entendí nada :P

1 comentario

  1. 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 :-)

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *