Was sind die Unterschiede zwischen Helper- und Utility-Klassen?

115

Wie bestimmen Sie, wie eine Klasse XHelper oder XUtils aufgerufen wird?

Meiner Meinung nach:

Die Hilfsklasse ist eine Klasse, die instanziiert werden und geschäftliche Arbeit leisten kann

Die Utils-Klasse ist eine statische Klasse, die kleine und sich wiederholende Operationen für eine Art Instanz ausführt (Beispiel für die Utils-Klassen ArrayUtils oder IOUtils von Apache).

Jakcam
quelle
5
"Business Work" ist hier der Hauptunterschied. Ich finde es eine nützliche Konvention, sie Utilsfür eine statische Klasse zu verwenden, die überall in der Organisation oder in einer anderen Organisation verwendet werden kann. Eine HelperKlasse verfügt über allgemeinen Code, der innerhalb eines Projekts wiederverwendet werden kann und Abhängigkeiten innerhalb des Projekts aufweist. Natürlich gibt es keine allgemein akzeptierte Regel, aber ich finde das nützlich.
Stephen Hosking
1
@StephenHosking Deine Erklärung überzeugt mich und vielleicht alle am meisten. Wenn möglich, würden Sie Ihre Erklärung als tatsächliche Antwort auf diesen Beitrag veröffentlichen und nicht nur einen Kommentar hinterlassen.
Bigair
@ Bigair. Danke, aber meiner ist nur ein Vorschlag, keine Antwort. Ich bin froh, dass die Leute es hilfreich fanden.
Stephen Hosking

Antworten:

101

Es gibt viele Namensstile. Ich würde Utils vorschlagen, nur weil es üblicher ist.

Unter einer Utility-Klasse werden nur statische Methoden verstanden und sie sind zustandslos. Sie würden keine Instanz einer solchen Klasse erstellen.

Ein Helper kann eine Utility-Klasse oder ein Stateful sein oder die Erstellung einer Instanz erfordern. Ich würde dies nach Möglichkeit vermeiden.

Wenn Sie den Namen genauer machen können. Wenn es beispielsweise Sortiermethoden gibt, machen Sie es zu XSorter

Für Arrays finden Sie Hilfsklassen wie

Array
Arrays
ArrayUtil
ArrayUtils
ArrayHelper

Übrigens ist eine kurze Hand für eine Utility-Klasse eine Aufzählung ohne Instanzen

enum XUtils {;
    static methods here
}

Wenn Sie eine Schnittstelle implementieren müssen, würde ich einen zustandslosen Singleton verwenden.

enum XHelper implements RequiredInterface {
   INSTANCE;
   // no instance fields.
}
Peter Lawrey
quelle
Ich dies in diesem Beitrag stackoverflow.com/a/2135797/787698 , dass Xutils eine statische Klasse ohne Abhängigkeiten ist. Was denkst du darüber?
Jakcam
@ Jakcam Interessanter Punkt. Ein Helfer kann zustandsbehaftet sein und eine Instanz erfordern. Ich würde wenn möglich eine zustandslose und instanzlose Dienstprogrammklasse verwenden.
Peter Lawrey
Was verstehen Sie unter Xutils ist eine statische Klasse ohne Abhängigkeiten ?
Jakcam
Ich kann in diesem Beitrag keine "xutils" oder "keine Abhängigkeiten" finden.
Peter Lawrey
1
@ John In diesem Fall ist eine Dienstprogrammmethode nicht wünschenswert, da es zu Testzwecken schwieriger ist, sie zu verspotten.
Peter Lawrey
16

Allgemein? Es ist völlig willkürlich. Hierfür gibt es keine Regeln.

Jesper
quelle
8

Ein Dienstprogramm ist eine allgemein verwendete "Blattknoten" -Klasse. Das heißt, es hat keine Abhängigkeiten in Ihrem Projekt und kann von Projekt zu Projekt portiert werden, ohne zu brechen oder unbrauchbar zu werden. Beispiele: Vector3, RandomNumberGenerator, StringMatcher, etc ...

Ein "Helfer" scheint jede Klasse zu sein, deren Entwurf darin besteht, einer anderen Klasse zu helfen. Diese können von Ihrem Projekt abhängen oder nicht. Wenn Sie eine GameNetworkClientKlasse erstellen , können Sie sagen, dass die GameNetworkConnectionKlasse ein "Helfer" ist, weil sie dem "hilft" GameNetworkClient.

Die Art und Weise, wie Entwickler auf Tools verweisen, spiegelt die allgemeine Verwendung dieser Wörter wider. Wenn Sie sich an Hörgeräte erinnern können, die als "hilfreich" oder "nützlich" beschrieben wurden, hat ein hilfreiches Werkzeug in der Regel einen gewissen Kontext (Käsereibe hilft beim Reiben von Käse, Maisentferner hilft beim Abstreifen von Mais, Speedloader hilft beim Nachladen einer Schusswaffe). Es wird erwartet, dass ein "Dienstprogramm" in einer Vielzahl von Kontexten funktioniert (WD-40, Klebeband, Armeemesser, Kleber, Taschenlampe usw.).

James M. Lay
quelle
4

Wie Jesper sagte, ist es völlig willkürlich . Sie können sich vorstellen, was für Ihre Organisation funktioniert, und dies zur Konvention machen.

Für mich ist es ungefähr so:

utils - Statische Klasse, die frei verschoben und überall importiert werden kann.

Allgemeine Aufgaben ausführen, die in verschiedenen Modulen hilfreich sein können. Wie Peter Lawrey sagte, sind spezifischere Namen nützlich.

Helfer - Klasse, die einer anderen Klasse oder einem Modul hilft .

Aufgaben, die nur in dem Modul verwendet werden, in dem sie platziert sind, sind nicht sinnvoll, um an anderer Stelle importiert zu werden. Daher könnte der Name spezifischer sein - ModuleName Helper (z. B. AdministrationHelper , LoginHelper )

typhon04
quelle
2

Darauf gibt es keine endgültige Antwort. Finde ein Namensschema heraus und bleibe dabei. Die Benennung Ihrer Pakete und Klassen ist ein wichtiger Bestandteil der Softwarearchitektur, und niemand kann Ihnen diese Entscheidung nehmen.

Ich persönlich mag den XHelper besser, aber ich sehe XUtils häufiger im Fremdcode.

Ich mag auch das Namensschema "Plural", das Sie sowohl im JDK als auch in Guava finden :

Wenn sich eine Klasse mit CollectionObjekten befasst , wird sie aufgerufenCollections

Array> Arrays (jdk)
Liste> Listen (Guave)
Karte> Karten (Guave)

etc.

Sean Patrick Floyd
quelle