Qu'est-ce qu'un assistant? Est-ce un motif de conception? Est-ce un algorithme?

40

Peut-être un peu ironique, mais comme je ne trouve aucune réponse à cette question via Google, il est donc important de s’assurer que le génie logiciel a bien la réponse:

Qu'est-ce qu'un assistant?

J'ai vu le nom utilisé partout (noms de modules, noms de classes, noms de méthodes), comme si la sémantique était profonde et significative, mais dans le contexte de l'informatique (bien que je ne sois pas diplômé), je ' Je n'ai jamais vu une description ou une définition nulle part!

Est-ce un motif de conception? Est-ce un algorithme? J'ai déjà travaillé sur un programme dans lequel le module et la classe s'appelaient tous deux quelque chose ( quelque chose d' assez générique aussi) et je l'ai rapidement renommé en quelque chose de sensé pour moi, mais j'ai le sentiment que quelque chose me manque!

Aaron Hall
la source
9
Helper est ce que vous appelez quelque chose lorsque vous ne savez pas comment l'appeler mais que vous connaissez l'un de ses amis. Un peu comme vous appeler 'ami de Zack' au lieu d'Aaron. Double plus ungood.
david.pfx
Un assistant est un membre privé, jusqu’à l’isomorphisme.
Thomas Eding
@ThomasEding, désolé de revenir 3 ans plus tard - mais j'ai vu beaucoup de membres "publics" appelés "helper", y compris des interfaces. J'aimerais une source sur votre définition (plus la qualité est élevée, mieux c'est) car cela me donnerait certainement une idée de plus d'odeurs de code.
Aaron Hall

Réponses:

63

Une classe Helper est une odeur de code moins connue lorsqu'un codeur a identifié certaines opérations diverses couramment utilisées et a tenté de les rendre réutilisables en les regroupant dans un groupe non naturel. Les développeurs successifs sont alors entrés dans le projet et ne se sont pas rendus compte que la classe d'assistance existait, et ont par conséquent réécrit les mêmes opérations courantes, voire ont créé plusieurs classes d'assistance.

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

De plus, comme vous l'avez déjà identifié, SomethingSomethingHelper est en réalité un nom terrible. Cela n'est pas descriptif et ne vous donne aucune idée précise du type d'opérations que fait la classe (ça aide?), Ce qui signifie également que ce n'est pas évident d'ajouter de nouveaux comportements, qu'ils appartiennent ou non à la classe Helper. Je diviserais ces classes en fonction de comportements connexes qui se grouperaient logiquement, puis je renommerais les nouvelles classes pour refléter ce qu'elles font.

M. Cochese
la source
9
Bien sûr, ce SomethingSomethingHelpern'est pas le nom réel de la classe. Qu'il s'agisse d'une odeur de code ou non, cela dépend de la spécificité de la classe d'assistance, car Mathces dernières ne sont pas du tout une odeur de code.
Robert Harvey
10
@ RobertHarvey - Enh, la plupart de celles que j'ai vues ont été nommées SomethingSomethingHelper. Bon sang, je regarde une classe nommée HelperMethodsdans l' <company>.Helpersespace de noms. Pour moi, une Helperclasse est dans le même seau que *Manager.
Telastyn
8
@ Telastyn: Peut-être que c'est une expérience, alors. J'ai parcouru les classes d'aide de mon projet actuel (il y en a plusieurs) et elles ont toutes des noms significatifs. Il n'y en a qu'un qui est suffixé Helper, et je pense que c'est pour le différencier d'une classe du .NET Framework portant le même nom. Je considérerais *Helperacceptable si *était quelque chose de significatif. HelperMethodsest juste un manque d'imagination; il devrait au moins y avoir des compartiments conceptuels spécifiques.
Robert Harvey
4
@ RobertHarvey - Vous avez probablement raison. Toute ma carrière dans les langues modernes a consisté à nettoyer les épaves de train.
Telastyn
1
Il existe un sous-ensemble de ces fonctions, appelées "fonctions d'assistance", qui sont réellement utiles et constituent un bon modèle. Par exemple, un ensemble commun de lignes qui devraient sinon être répétées dans une fonction - un exemple de leur affichage est le cas où vous avez besoin d'une do..whileboucle en Python, que le langage ne prend pas en charge (voir le deuxième exemple ici ). Une autre serait une structure if / elif /.../ else, mais il faudrait répéter un cas en haut et en bas. Dans la mesure du possible, ils doivent cependant être localisés dans cette fonction et généralement pas appelés "aide".
Izkata
5

Un assistant est une classe ou une méthode supplémentaire inoffensive, dans la mesure où il complète un composant externe. Dans le cas contraire, cela indique une mauvaise conception, car le code a été exclu de son autorité, s'il en existe une.

Voici un exemple d'aide inoffensive. J'utilise une méthode appelée FindRepcompte 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 de mauvaise aide:

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; }
    }
}
Léopold Asperger
la source
-1

Mon entreprise utilisait auparavant la méthodologie Classe de base / Classe d'assistance, chaque objet ayant deux classes. Vous auriez une classe Person contenant toutes les propriétés et définitions de la classe et une classe PersonHelper contenant toutes les méthodes, instructions SQL et logique qui manipulaient la classe Person. Cela a bien fonctionné pour nous car toutes nos applications utilisent des instructions SQL pour manipuler des données et il était très facile pour nous de rechercher et de modifier les instructions SQL selon les besoins.

Depuis, nous sommes passés à autre chose et mettons maintenant tout dans la classe Personne / Base. Nous avons cessé d'utiliser la convention de nommage Helper car nous voulions avoir moins de fichiers dans nos projets. En outre, la longueur de certains noms de classe devenait incontrôlable. lol.

Pas un bon exemple, mais vous avez l’idée.

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

Je ne dis pas que l'utilisation de la convention de nommage des assistants est la solution idéale, mais cela a fonctionné pour nous pendant quelques années.

Brian
la source
2
Vous n'avez pas expliqué pourquoi.
Robert Harvey
2
Oui, j'aimerais aussi cette explication.
Aaron Hall
@AaronHall Considérez que c'est une bonne chose que vous ne compreniez pas leur choix.
Leopold Asperger