web-dev-qa-db-fra.com

Qu'est-ce qu'un assistant? Est-ce un modèle de conception? Est-ce un algorithme?

Peut-être un peu ironique, mais comme je ne trouve cette réponse nulle part via Google, alors assurez-vous que l'ingénierie logicielle a la réponse:

Qu'est-ce qu'un assistant?

J'ai vu le nom utilisé partout (noms de module, noms de classe, noms de méthode), comme si la sémantique était profonde et significative, mais dans le contexte de l'informatique (même si je n'ai pas de diplôme), je ' ai jamais vu une description ou une définition nulle part!

Est-ce un modèle de conception? Est-ce un algorithme? J'ai déjà travaillé sur un programme dans lequel le module et la classe étaient tous deux appelés Somethingsomethinghelper (où Somethingsomething était assez générique aussi) et je l'ai rapidement renommé en quelque chose qui avait du sens pour moi, mais j'ai l'impression de manquer quelque chose ici!

43
Aaron Hall

Une classe Helper est une odeur de code moins connue où un codeur a identifié certaines opérations diverses et couramment utilisées et a tenté de les rendre réutilisables en les regroupant dans un groupe non naturel. Les développeurs successifs sont ensuite entrés dans le projet et n'ont pas réalisé que la classe d'assistance existe, et ont par conséquent réécrit les mêmes opérations communes, ou même créé plus de classes d'assistance.

Mais sérieusement, le principal problème avec les classes Helper est qu'elles sont généralement des opérations qui agissent sur une classe spécifique, ce qui signifie évidemment en OO termes qu'elles souffrent d'un cas aigu de Feature Envy . Cet échec à empaqueter le comportement avec les données sur lesquelles il agit est la raison pour laquelle les développeurs échouent si souvent (selon mon expérience) à le trouver.

En plus de cela, comme vous l'avez déjà identifié, SomethingSomethingHelper est en fait un nom terrible. Il n'est pas descriptif et ne vous donne aucune idée réelle du type d'opérations de la classe (cela aide?), Ce qui signifie également que ce n'est pas évident lors de l'ajout de nouveaux comportements, qu'ils appartiennent ou non à la classe Helper. Je diviserais ces classes en fonction des comportements associés qui se regroupent logiquement, puis je renommerais les nouvelles classes pour refléter ce qu'elles font.

70
Mr Cochese

Un assistant est une classe ou une méthode supplémentaire inoffensive, tant qu'il complète un composant externe. Quand il fait le contraire, alors il indique une mauvaise conception car le code a été exclu de son autorité, s'il y a une autorité.

Voici un exemple d'une aide inoffensive, j'utilise une méthode appelée FindRep qui compte le nombre de zéros non significatifs.

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

La méthode d'assistance est très simple, mais très peu pratique à copier-coller et le framework ne fournit aucune solution.

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;
}

Et voici un exemple d'un mauvais assistant:

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; }
    }
}
5
Leopold Asperger