Was ist ein Helfer? Ist es ein Designmuster? Ist es ein Algorithmus?

40

Vielleicht ein bisschen frech, aber da ich diese Antwort nirgendwo über Google finde, kann ich sicherstellen, dass Software Engineering die Antwort hat:

Was ist ein Helfer?

Ich habe gesehen, dass der Name überall verwendet wird (Modulnamen, Klassennamen, Methodennamen), als ob die Semantik tiefgründig und aussagekräftig wäre, aber im Kontext der Informatik (obwohl ich keinen Abschluss darin habe). ' Ich habe noch nie eine Beschreibung oder Definition gesehen!

Ist es ein Designmuster? Ist es ein Algorithmus? Ich habe einmal an einem Programm gearbeitet, in dem das Modul und die Klasse beide " SomethingsomethingHelper" genannt wurden (wobei etwas auch ziemlich allgemein war), und ich habe es umgehend in etwas umbenannt, das für mich sinnvoll war, aber ich habe das Gefühl, dass mir hier etwas fehlt!

Aaron Hall
quelle
9
Helfer nennt man etwas, wenn man nicht weiß, wie man es nennt, aber einen seiner Freunde kennt. Ein bisschen wie du "Freund von Zack" anstelle von Aaron zu nennen. Double plus ungut.
david.pfx
Ein Helfer ist jedes private Mitglied bis hin zur Isomorphie.
Thomas Eding
@ThomasEs tut mir leid, dass ich 3 Jahre später wiederkomme - aber ich habe viele "öffentliche" Mitglieder gesehen, die "Helfer" genannt werden, einschließlich Schnittstellen. Ich hätte gerne eine Quelle für Ihre Definition (je höher die Qualität, desto besser), da ich dadurch definitiv mehr Sinn für Codegerüche hätte.
Aaron Hall

Antworten:

63

Eine Helper-Klasse ist ein weniger bekannter Codegeruch, bei dem ein Codierer verschiedene, häufig verwendete Vorgänge identifiziert und versucht hat, sie durch Zusammenfassen in einer unnatürlichen Gruppierung wiederverwendbar zu machen. Nachfolgende Entwickler sind dann in das Projekt eingetreten und haben nicht bemerkt, dass die Hilfsklasse vorhanden ist, und haben folglich dieselben allgemeinen Operationen umgeschrieben oder sogar mehrere Hilfsklassen erstellt.

Im Ernst, das Hauptproblem bei Helper-Klassen ist, dass es sich in der Regel um Operationen handelt, die auf eine bestimmte Klasse angewendet werden, was in OO-Begriffen offensichtlich bedeutet, dass sie an einem akuten Fall von Feature Envy leiden . Dieses Versagen, das Verhalten mit den Daten, auf die es sich bezieht, zu packen, ist der Grund, warum Entwickler es (meiner Erfahrung nach) so oft nicht finden.

Darüber hinaus ist SomethingSomethingHelper, wie Sie bereits identifiziert haben, ein schrecklicher Name. Es ist nicht aussagekräftig und gibt Ihnen keine wirkliche Ahnung, welche Art von Operationen die Klasse ausführt (es hilft?), Was auch bedeutet, dass es beim Hinzufügen neuer Verhalten nicht offensichtlich ist, ob sie zur Helper-Klasse gehören oder nicht. Ich würde solche Klassen nach dem Muster des verwandten Verhaltens aufteilen, das sich logisch gruppiert, und dann die neuen Klassen umbenennen, um zu reflektieren, was sie tun.

Herr Cochese
quelle
9
Ziemlich sicher, dass dies SomethingSomethingHelpernicht der tatsächliche Name der Klasse ist. Ob es sich um einen Codegeruch handelt oder nicht, hängt davon ab, wie spezifisch die Helferklasse ist, da Helferklassen wie Mathüberhaupt kein Codegeruch sind.
Robert Harvey
10
@RobertHarvey - Die meisten von denen, die ich gesehen habe, wurden benannt SomethingSomethingHelper. Verdammt, ich schaue mir gerade eine Klasse an, die HelperMethodsim <company>.HelpersNamensraum heißt. Für mich befindet sich eine HelperKlasse im selben Eimer wie *Manager.
Telastyn
8
@Telastyn: Vielleicht ist es dann eine Erfahrung. Ich habe die Helferklassen in meinem aktuellen Projekt durchgesehen (es gibt mehrere) und alle haben aussagekräftige Namen. Es gibt nur eine, an die ein Suffix angehängt ist Helper, und ich denke, dies dient dazu, eine Klasse in .NET Framework mit demselben Namen zu trennen. Ich würde *Helperakzeptieren, wenn *etwas Sinnvolles wäre. HelperMethodsist nur ein Versagen der Vorstellungskraft; es sollte zumindest bestimmte konzeptionelle Eimer geben.
Robert Harvey
4
@RobertHarvey - Sie haben wahrscheinlich Recht. Während meiner gesamten Karriere mit modernen Sprachen habe ich Zugunglücke aufgeräumt.
Telastyn
1
Es gibt eine Untermenge dieser "Hilfsfunktionen", die tatsächlich nützlich sind und ein gutes Muster aufweisen. Beispiel: Eine häufig vorkommende Gruppe von Zeilen, die ansonsten innerhalb einer Funktion wiederholt werden müssten. Ein Beispiel dafür, wo sie angezeigt werden, ist, wenn Sie do..whilein Python eine Schleife benötigen , die die Sprache nicht unterstützt (siehe das zweite Beispiel hier ). Eine andere wäre eine if / elif /.../ else-Struktur, aber Sie müssen einen Fall oben und unten wiederholen. Wenn möglich, sollten sie für diese Funktion lokal gemacht werden und im Allgemeinen nicht als "Helfer" bezeichnet werden.
Izkata
5

Ein Helfer ist eine harmlose zusätzliche Klasse oder Methode, solange er eine externe Komponente ergänzt. Wenn das Gegenteil der Fall ist, weist dies auf ein fehlerhaftes Design hin, da der Code von seiner Berechtigung ausgeschlossen wurde, sofern überhaupt eine Berechtigung vorliegt.

Hier ist ein Beispiel für einen harmlosen Helfer. Ich verwende eine Methode FindRep, die die Anzahl der führenden Nullen zählt.

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

Die Hilfsmethode ist sehr einfach, aber sehr unpraktisch beim Kopieren und Einfügen, und das Framework bietet keine Lösung.

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

Und hier ist ein Beispiel für einen schlechten Helfer:

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
quelle
-1

Meine Firma verwendete früher die Methode der Basisklasse / Hilfsklasse, bei der jedes Objekt über zwei Klassen verfügte. Sie hätten eine Person-Klasse, die alle Klasseneigenschaften und -definitionen enthält, und eine PersonHelper-Klasse, die alle Methoden, SQL-Anweisungen und Logik enthält, die die Person-Klasse manipuliert haben. Dies hat sich für uns bewährt, da alle unsere Anwendungen SQL-Anweisungen zum Manipulieren von Daten verwenden und es für uns sehr einfach war, die SQL-Anweisungen nach Bedarf zu finden und zu ändern.

Wir sind seitdem weitergezogen und haben jetzt alles in die Klasse Person / Basis eingeordnet. Wir haben die Verwendung der Namenskonvention Helper beendet, weil wir weniger Dateien in unseren Projekten haben wollten. Auch die Länge einiger Klassennamen geriet außer Kontrolle. lol.

Kein gutes Beispiel, aber Sie bekommen die Idee.

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

Ich sage nicht, dass die Verwendung der Helfer-Namenskonvention die perfekte Lösung ist, aber sie hat für einige Jahre bei uns funktioniert.

Brian
quelle
2
Du hast nicht erklärt warum.
Robert Harvey
2
Ja, diese Erklärung hätte ich auch gern.
Aaron Hall
@AaronHall Betrachte es als eine gute Sache, dass du ihre Wahl nicht verstehst.
Leopold Asperger