Vielleicht ein bisschen frech, aber da ich diese Antwort nirgendwo über Google finden kann, um sicherzustellen, 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 tief und aussagekräftig wäre, aber im Kontext der Informatik (obwohl ich keinen Abschluss darin habe) habe ich nirgendwo eine Beschreibung oder Definition gesehen !

Ist es ein Entwurfsmuster? Ist es ein Algorithmus? Ich habe einmal an einem Programm gearbeitet, in dem sowohl das Modul als auch die Klasse etwas als Helfer genannt wurden (wobei etwas em> war auch ziemlich allgemein) und ich habe es sofort in etwas umbenannt, das für mich Sinn machte, aber ich habe das Gefühl, dass mir hier etwas fehlt!

Kommentare

  • Helfer ist das, was Sie etwas nennen, wenn Sie ‚ nicht wissen, wie Sie es nennen sollen, aber y Du kennst einen seiner Freunde. Ein bisschen wie dich ‚ Freund von Zack ‚ anstelle von Aaron zu nennen. Double plus ungood.
  • Ein Helfer ist jedes private Mitglied, bis hin zum Isomorphismus.
  • @ThomasEding Entschuldigung, 3 Jahre später wiederzukommen – aber ich ‚ Ich habe viele “ öffentliche “ Mitglieder namens “ helper „, einschließlich Schnittstellen. Ich ‚ hätte gerne eine Quelle für Ihre Definition (je höher die Qualität, desto besser), da dies mir definitiv ein Gefühl für mehr Codegerüche geben würde.

Antwort

Eine Hilfsklasse ist ein weniger bekannter Codegeruch, bei dem ein Codierer verschiedene, häufig verwendete Operationen identifiziert und versucht hat, sie durch Zusammenfassen wiederverwendbar zu machen zusammen in einer unnatürlichen Gruppierung. Aufeinanderfolgende Entwickler sind dann auf das Projekt gekommen und haben nicht erkannt, dass die Hilfsklasse vorhanden ist, und haben folglich dieselben allgemeinen Operationen neu geschrieben oder sogar mehr Hilfsklassen erstellt.

Aber im Ernst, das Hauptproblem bei Hilfsklassen ist dass es sich normalerweise um Operationen handelt, die auf eine bestimmte Klasse wirken, was in OO-Begriffen offensichtlich bedeutet, dass sie an einem akuten Fall von Feature Envy leiden. Dieses Versäumnis, das Verhalten mit den Daten zu verpacken, auf die es wirkt, ist der Grund, warum Entwickler es (meiner Erfahrung nach) so oft nicht finden.

Darüber hinaus ist SomethingSomethingHelper, wie Sie bereits festgestellt haben, tatsächlich ein schrecklicher Name . Es ist nicht beschreibend und gibt Ihnen keine wirkliche Ahnung davon, welche Art von Operationen die Klasse ausführt (es hilft?), Was auch bedeutet, dass es beim Hinzufügen neuer Verhaltensweisen nicht offensichtlich ist, ob sie zur Helper-Klasse gehören oder nicht. Ich würde brechen Richten Sie solche Klassen nach dem Vorbild eines verwandten Verhaltens ein, das sich logisch zusammenfasst, und benennen Sie die neuen Klassen dann um, um zu reflektieren, was sie tun.

Kommentare

  • Hübsch Stellen Sie sicher, dass SomethingSomethingHelper nicht der tatsächliche Name der Klasse ist. Ob ‚ ein Code riecht oder nicht, hängt davon ab, wie spezifisch die Hilfsklasse ist, da Hilfsklassen wie Math überhaupt kein Codegeruch sind.
  • @RobertHarvey – Enh, die meisten von mir ‚ habe gesehen, dass SomethingSomethingHelper genannt wurde. Hölle, ich ‚ Ich betrachte gerade eine Klasse mit dem Namen HelperMethods im <company>.Helpers -Namensraum. Für mich eine befindet sich im selben Bucket wie die *Manager.
  • @Telastyn: Vielleicht ‚ s also eine erfahrungssache. Ich habe ‚ die Hilfsklassen in meinem aktuellen Projekt durchgesehen (es gibt mehrere), und alle haben aussagekräftige Namen. Es gibt ‚ nur eine, die ‚ mit dem Suffix Helper versehen ist, und ich denke, dass ‚ s, um es von einer Klasse in .NET Framework mit demselben Namen zu unterscheiden. Ich ‚ würde *Helper für akzeptabel halten, wenn * etwas Sinnvolles wäre. HelperMethods ist nur ein Mangel an Vorstellungskraft; Es sollte zumindest bestimmte konzeptionelle Buckets geben.
  • @RobertHarvey – Sie ‚ haben wahrscheinlich Recht. Während meiner gesamten Karriere mit modernen Sprachen habe ich Zugwracks beseitigt.
  • Es gibt eine Teilmenge davon, die als “ Hilfsfunktionen , die eigentlich nützlich und ein gutes Muster sind.Beispiel: Ein allgemeiner Satz von Zeilen, die andernfalls innerhalb einer Funktion wiederholt werden müssten – ein Beispiel dafür, wo sie angezeigt werden, ist, wenn Sie in Python eine do..while -Schleife benötigen, die die Sprache ist ‚ unterstützt dies nicht (siehe das zweite Beispiel hier ). Eine andere wäre eine if / elif /…/ else-Struktur, muss aber einen Fall oben und unten wiederholen. Wenn möglich, sollten sie jedoch lokal für diese Funktion erstellt und im Allgemeinen nicht als “ -Helfer “ bezeichnet werden.

Antwort

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 schlechtes Design hin, da der Code von seiner Berechtigung ausgeschlossen wurde, sofern überhaupt eine Berechtigung vorhanden ist.

Hier ist ein Beispiel für einen harmlosen Helfer. Ich verwende eine Methode namens FindRep, das 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; } } }  

Kommentare

  • Zeigen Sie mir also, wie DutchZipcodeHelper gemacht werden soll?
  • @ Pulver366 Validate ist privat Methode für die niederländische Postleitzahl

Antwort

Der Helfer ist ein häufig verwendeter Namensanhang.

Allerdings , es kommuniziert sehr wenig a darüber, was es tut. Jedes Mal, wenn ich gesehen habe, dass es verwendet wird, habe ich festgestellt, dass es ein suboptimaler Name ist.

Tatsächlich betrachte ich es als Codegeruch, der auf weitere Probleme darunter hinweist.

Beispiel

Angenommen, wir sehen den Namen “ WidgetHelper “ (hier “ Widget “ ist ein Ersatzname für jede Art von programmierbarer Funktionalität und nicht unbedingt ein UI-Widget):

 class WidgetHelper: ...  

Was lernen wir aus dem Namen? Wir wissen, dass das Objekt oder die Funktion eine Arbeit erledigt, die dem Widget nachgeordnet ist. Ich habe die Erfahrung gemacht, dass dies möglicherweise nicht einmal der Fall ist und man den “ -Helfer “ aus dem Namen löschen und die Kommunikation verbessern kann.

Für eine andere Möglichkeit könnte “ WidgetHelper “ das Widget so umschließen, dass der Widget-Code selbst dies weiß nichts über den Helfer. Die Implikation ist, dass WidgetHelper in diesem Pseudocode-Beispiel Teil der öffentlichen API ist:

 class WidgetHelper: def __init__(self): self.widget = Widget() ...  

In diesem Fall wäre so etwas wie “ WidgetAPI “ ein besserer Name. weil dies zumindest den Benutzer über seine Beziehung zur Widget-Klasse informiert. Oder wir löschen “ Helper “ aus dem Namen und benennen Widget in so etwas um WidgetImplementation.

Alternativ könnte es vom Widget umbrochen und aufgerufen werden, was bedeutet, dass es nicht Teil der öffentlichen API ist, sondern eher Teil der Implementierungsdetails.

 class Widget: def __init__(self): self.widget_helper = WidgetHelper() ...  

Auch in diesem Fall kleine Menge an Informationen Wir haben eine Verbesserung gegenüber dem “ -Helfer. “ Es wäre aussagekräftiger, ihn als generischen Namen wie “ WidgetImplementation. “

“ Implementierung “ ist möglicherweise korrekt, da die Implementierung möglicherweise zu viel unternimmt, um einen genaueren Namen zu erhalten. Oder es kann selbst zu vage sein – dies liegt im Ermessen des Namensgebers.

Aber wie wir gesehen haben, ist der Name “ Helfer “ hilft nicht, zu verstehen, was im Code vor sich geht, außer es ist eine Ergänzung zum Hauptobjekt von Interesse. “ Helper, “ kann viele Arten von Beziehungen bedeuten. Daher ist es zu vage und nebulös und nicht gut geeignet, um den Benutzer darüber zu informieren, was das Objekt tut.

Fazit

Das Benennen von Dingen ist eines der schwierigen Probleme in der Informatik.

Was bei einem Namen wünschenswert ist, ist, dass er den Benutzer darüber informiert, was das benannte Ding tun soll.

In jedem Fall wäre es jedoch aussagekräftiger, einen anderen Namen als “ helper “ oder einfach zu verwenden entfernen Sie es insgesamt.

Als Folge meiner Erfahrung und dieser Diskussion signalisiert auch die Wahl des “ -Helfers “ in einem Namen geringer Aufwand oder Raffinesse seitens des Namensgebers (richtig oder nicht). Es ist in der Tat ein Codegeruch.

Bitte nennen Sie nichts einen “ -Helfer. “

Antwort

Es ist eigentlich beides nicht.

“ Helfer “ ist ein Sammelbegriff für eine Gruppe von Funktionen.

Ein Helfer ist etwas, das projektübergreifend funktioniert und eine kleine Sache tut. Diese Leute sind oft nicht einmal in einer Klasse organisiert, sie erweitern lediglich die Funktionalität oder die Fähigkeiten der Sprache selbst. Ich halte Folgendes für ein sehr gutes Beispiel für einen Helfer:

 function linesOf($mls) { return preg_split("/\s*\n\s*/",trim($mls)); }  

Diese winzige Funktion kann einen großen Einfluss darauf haben, wie Sie Ihren Code organisieren (Sie werden es lieben, Ihre Literallisten in mehrzeilige Zeichenfolgen zu setzen), aber an sich bedeutet sie so gut wie nichts. Es ist ein verherrlichtes Regex-Muster. Dennoch macht es Ihren Code viel lesbarer, wenn Sie

 $a = linesOf(" apples bananas cherries ");   

anstelle des reinen Regex-Äquivalents.

Das sind also Helfer. Winzige Werkzeuge für generische Jobs, die keiner bestimmten Klasse angehören. Sie können sie in eine erzwingen (linesOf könnte eine Methode einer Zeichenfolgenklasse sein), aber wo sie wirklich hingehören, ist entweder der globale Namespace oder eine statische Sammlung solcher Tools.

Daumenregel: Wenn es hilfreich ist, aber nirgendwo hingehört, ist es wahrscheinlich ein Helfer.

Antwort

Natürlich “ Dies ist eine Grauzone, “ aber Meine pragmatische Erfahrung war, dass Menschen “ -Helfer “ erfinden, wenn sie einen für sie nützlichen Satz gemeinsamen Codes identifiziert haben, den sie nicht verwenden Ich möchte nicht erneut implementieren. (Einige Sprachen bezeichnen diese als “ Mixins. „)

Das Problem ist, dass der Common-Code ist tangential bezog sich auf jede der anderen Klassen, denen “ helfen könnte. “ Anstatt ein Teil von zu sein Als strenge Klassenhierarchie hilft sie lediglich “ “ [allen …]. Diese Strategie vermeidet das Duplizieren von Quellcode, ist jedoch nicht ungefährlich.

Antwort

Mein Unternehmen hat früher die Basis verwendet Klassen- / Hilfsklassenmethode, bei der jedes Objekt zwei Klassen haben würde. 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 bei uns gut funktioniert, da alle unsere Anwendungen SQL-Anweisungen zum Bearbeiten von Daten verwenden und es für uns sehr einfach war, die SQL-Anweisungen nach Bedarf zu finden und zu ändern.

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

Kein gutes Beispiel, aber Sie haben die Idee.

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

Ich sage nicht, dass die Verwendung der Helfer-Namenskonvention perfekt ist Lösung, aber es hat bei uns einige Jahre lang funktioniert.

Kommentare

  • Sie haben ‚ t nicht Erklären Sie, warum.
  • Ja, ich ‚ würde diese Erklärung auch mögen.
  • @AaronHall Betrachten Sie es als eine gute Sache, die Sie nicht verstehen ihre Wahl.
  • Der übliche Grund ist “ Jemand hielt es für eine gute Idee „.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.