¿Qué es un ayudante? ¿Es un patrón de diseño? ¿Es un algoritmo?

40

Tal vez un poco irónico, pero como no puedo encontrar esta respuesta en ningún lado a través de Google, para asegurarme de que Ingeniería de Software tenga la respuesta:

¿Qué es un ayudante?

He visto que el nombre se usa en todas partes (nombres de módulos, nombres de clases, nombres de métodos), como si la semántica fuera profunda y significativa, pero en el contexto de la informática (aunque no tengo un título en ella), yo ' ¡Nunca he visto una descripción o definición en ningún lado!

¿Es un patrón de diseño? ¿Es un algoritmo? Una vez trabajé en un programa en el que el módulo y la clase se llamaban algo algo útil (donde algo también era bastante genérico) y rápidamente lo renombré por algo que tenía sentido para mí, ¡pero siento que me falta algo aquí!

Aaron Hall
fuente
9
Ayudante es lo que llamas algo cuando no sabes cómo llamarlo pero conoces a uno de sus amigos. Algo así como llamarte 'amigo de Zack' en lugar de Aaron. Doble más injusto.
david.pfx
Un ayudante es cualquier miembro privado, hasta el isomorfismo.
Thomas Eding
@ThomasEding lamento volver 3 años después, pero he visto muchos miembros "públicos" llamados "ayudantes", incluidas las interfaces. Me gustaría una fuente en su definición (cuanto mayor sea la calidad, mejor) porque eso definitivamente me daría una idea de más olores de código.
Aaron Hall

Respuestas:

63

Una clase Helper es un código de olor menos conocido en el que un codificador ha identificado algunas operaciones misceláneas y de uso común e intentó hacerlas reutilizables al agruparlas en una agrupación antinatural. Los sucesivos desarrolladores han entrado en el proyecto y no se han dado cuenta de que existe la clase auxiliar, y en consecuencia han reescrito las mismas operaciones comunes, o incluso creado más clases auxiliares.

Pero en serio, el principal problema con las clases Helper es que generalmente son operaciones que actúan en una clase específica, lo que obviamente significa en términos OO que sufren un caso agudo de Feature Envy . Esta falla al empaquetar el comportamiento con los datos sobre los que actúa es la razón por la cual los desarrolladores con tanta frecuencia (en mi experiencia) no lo encuentran.

Además de esto, como ya ha identificado SomethingSomethingHelper es en realidad un nombre terrible. No es descriptivo, y no le da una idea real de qué tipo de operaciones realiza la clase (¿ayuda?), Lo que también significa que no es obvio al agregar nuevos comportamientos si pertenecen o no a la clase Helper. Rompería esas clases según las líneas de comportamiento relacionado que se agrupan lógicamente, y luego cambiaría el nombre de las nuevas clases para reflejar lo que hace.

Sr. cochese
fuente
9
Estoy bastante seguro de que ese SomethingSomethingHelperno es el nombre real de la clase. Si se trata de un olor a código o no, dependerá de cuán específica sea la clase auxiliar, ya que las clases auxiliares como Mathno son un olor a código en absoluto.
Robert Harvey
10
@RobertHarvey - Enh, la mayoría de los que he visto han sido nombrados SomethingSomethingHelper. Demonios, estoy viendo una clase ahora nombrada HelperMethodsen el <company>.Helpersespacio de nombres. Para mí, una Helperclase está en la misma categoría que *Manager.
Telastyn
8
@Telastyn: Quizás sea una experiencia, entonces. He revisado las clases auxiliares en mi proyecto actual (hay varias), y todas tienen nombres significativos. Solo hay uno con sufijo Helper, y creo que eso es desambiguarlo de una clase en .NET Framework que tiene el mismo nombre. Consideraría *Helperaceptable si *fuera algo significativo. HelperMethodses solo un fracaso de la imaginación; al menos debería haber cubos conceptuales específicos.
Robert Harvey
44
@RobertHarvey - Probablemente tengas razón. Toda mi carrera usando idiomas modernos ha sido limpiar los restos de trenes.
Telastyn
1
Hay un subconjunto de estos, llamados "funciones auxiliares", que son realmente útiles y un buen patrón. Por ejemplo, un conjunto común de líneas que de lo contrario tendrían que repetirse dentro de una función; un ejemplo de dónde aparecen es cuando necesita un do..whilebucle en Python, que el lenguaje no admite (vea el segundo ejemplo aquí ). Otra sería una estructura if / elif /.../ else, pero necesita repetir un caso en la parte superior e inferior. Sin embargo, si es posible, deben hacerse locales para esa función y, en general, no deben llamarse "ayudantes".
Izkata
5

Un ayudante es una clase o método adicional inofensivo, siempre que complemente un componente externo. Cuando hace lo contrario, indica un mal diseño porque el código ha sido excluido de su autoridad, si es que existe alguna autoridad.

Aquí hay un ejemplo de un ayudante inofensivo, utilizo un método llamado FindRepque cuenta el número de ceros a la izquierda.

digits = digits.Remove(0, TextHelper.FindRep('0', digits, 0, digits.Length - 2));

El método auxiliar es muy simple, pero muy inconveniente para copiar y pegar, y el marco no proporciona ninguna solución.

public static int FindRep(char chr, string str, int beginPos, int endPos)
{
    int pos;

    for (pos = beginPos; pos <= endPos; pos++)
    {
        if (str[pos] != chr)
        {
            break;
        }
    }

    return pos - beginPos;
}

Y aquí hay un ejemplo de un mal ayudante:

public static class DutchZipcodeHelper
{
    public static bool Validate(string s)
    {
        return Regex.IsMatch(s, @"^[1-9][0-9]{3}[A-Z]{2}$", RegexOptions.IgnoreCase);
    }
}

public class DutchZipcode
{
    private string value;

    public DutchZipcode(string value)
    {
        if (!DutchZipcodeHelper.Validate(value))
        {
            throw new ArgumentException();
        }

        this.value = value;
    }

    public string Value
    {
        get { return value; }
    }
}
Leopold Asperger
fuente
-1

Mi compañía solía usar la metodología de la clase Base / clase Helper donde cada objeto tendría dos clases. Tendría una clase Person que contenía todas las propiedades y definiciones de la clase y una clase PersonHelper que contenía todos los métodos, sentencias SQL y Logic que manipulaban la clase Person. Esto funcionó bien para nosotros porque todas nuestras aplicaciones usan declaraciones SQL para manipular datos y fue muy fácil para nosotros encontrar y modificar las declaraciones SQL según sea necesario.

Desde entonces hemos avanzado y ahora colocamos todo en la clase Persona / Base. Dejamos de usar la convención de nombres Helper porque queríamos tener menos archivos en nuestros proyectos. Además, la longitud de algunos de los nombres de clase se descontrolaba. jajaja

No es un gran ejemplo, pero entiendes la idea.

s = CompanyName.PersonHelper.GetPerson()
s = CompanyName.Person.GetPerson()

No digo que usar la convención de nomenclatura auxiliar sea la solución perfecta, pero funcionó para nosotros durante algunos años.

Brian
fuente
2
No explicaste por qué.
Robert Harvey
2
Sí, me gustaría esa explicación también.
Aaron Hall
@AaronHall Considere que es bueno que no entienda su elección.
Leopold Asperger