Namenskonvention für Dienstprogrammklassen in Java

115

Welche guten Richtlinien sollten Sie beim Schreiben von Utility-Klassen in Java beachten?

Sollten Pakete "util" oder "utils" sein? Ist es ClassUtil oder ClassUtils? Wann ist eine Klasse ein "Helfer" oder ein "Dienstprogramm"? Dienstprogramm oder Dienstprogramme? Oder verwenden Sie eine Mischung aus ihnen?

Die Standard-Java-Bibliothek verwendet sowohl Utils als auch Utilities:

  • javax.swing.Utilities
  • javax.print.attribute.AttributeSetUtilities
  • javax.swing.plaf.basic.BasicGraphicsUtils

Apache verwendet eine Vielzahl von Util und Utils, obwohl meistens Utils:

  • org.apache.commons.modeler.util.DomUtil
  • org.apache.commons.modeler.util.IntrospectionUtils
  • org.apache.commons.io.FileSystemUtils
  • org.apache.lucene.wordnet.AnalyzerUtil
  • org.apache.lucene.util.ArrayUtil
  • org.apache.lucene.xmlparser.DOMUtils

Spring verwendet viele Helper- und Utils-Klassen:

  • org.springframework.web.util.UrlPathHelper
  • org.springframework.core.ReflectiveVisitorHelper
  • org.springframework.core.NestedExceptionUtils
  • org.springframework.util.NumberUtils

Wie benennen Sie Ihre Dienstprogrammklassen?

JR.
quelle

Antworten:

82

Wie bei vielen solchen Konventionen ist es weniger wichtig, welche Konvention Sie verwenden, als dass Sie sie konsequent verwenden. Wenn Sie beispielsweise drei Dienstprogrammklassen haben und sie CustomerUtil, ProductUtils und StoreUtility nennen, werden andere Personen, die versuchen, Ihre Klassen zu verwenden, ständig verwirrt und geben versehentlich CustomerUtils ein. Sie müssen nachschlagen und Sie einige Male verfluchen. usw. (Ich habe einmal einen Vortrag über Konsistenz gehört, in dem der Redner eine Folie mit einem Umriss seiner Rede mit drei Hauptpunkten mit den Bezeichnungen "1", "2nd" und "C" aufstellte.)

Machen Sie niemals zwei Namen, die sich nur in einer subtilen Schreibweise unterscheiden, wie z. B. ein CustomerUtil und ein CustomerUtility. Wenn es einen guten Grund gab, zwei Klassen zu machen, dann müssen sie etwas anderes haben, und der Name sollte uns zumindest einen Hinweis geben, was dieser Unterschied ist. Wenn eine Dienstprogrammfunktion in Bezug auf Name und Adresse enthält und die andere Dienstprogrammfunktionen in Bezug auf Bestellungen enthält, nennen Sie sie CustomerNameAndAddressUtil und CustomerOrderUtil oder ähnliches. Ich bin regelmäßig verrückt, wenn ich bedeutungslose subtile Unterschiede in den Namen sehe. Wie erst gestern arbeitete ich an einem Programm mit drei Feldern für Frachtkosten: "Fracht", "Frachtkosten" und "Frachtkosten". Ich musste den Code studieren, um herauszufinden, was der Unterschied zwischen ihnen war.

Jay
quelle
9
Und IV Nummer 4 :-) - Aber was war der Unterschied zwischen Fracht , Frachtgebühren und frght ?
KajMagnus
4
@ KayMagnus Dieser Beitrag war vor über einem Jahr, aber wie ich mich erinnere, waren einer davon die aktuellen Frachtkosten in der Aufzeichnung, bevor der Inhalt der Bestellung und damit möglicherweise die Frachtkosten geändert wurden. Ein anderer Grund waren die Standardfrachtkosten, die einem Tisch entnommen wurden. und der dritte war ein kalkulierter Kostenfaktor, der in einigen Sonderfällen verwendet wurde, beispielsweise bei Sendungen nach Übersee. Zum Beispiel, warum konnten sie sie nicht wenigstens "currFreight", "stdFreight" und "calcFreight" nennen. Das hätte zumindest einen Abschluss gegeben.
Jay
Okay, danke für die Erklärung :-) Ein interessantes seltsames Codebeispiel, denke ich
KajMagnus
31

Hierfür gibt es in der Java-Welt keine Standardregel / -konvention. Ich bevorzuge es jedoch, "s" am Ende des Klassennamens hinzuzufügen, wie @colinD erwähnt hat.

Das scheint ziemlich normal zu sein, was der Master-Java-API-Designer Josh Bloch tut (Java-Sammlung sowie Google-Sammlung).

Solange Helper und Util verfügbar sind, werde ich etwas als Helper bezeichnen, wenn es APIs enthält, mit denen eine bestimmte Funktionalität eines Pakets erreicht werden kann (unter Berücksichtigung eines Pakets zur Implementierung eines Moduls). In der Zwischenzeit kann ein Util in jedem Kontext aufgerufen werden.

In einer Anwendung, die sich auf Bankkonten bezieht, werden beispielsweise alle nummernspezifischen statischen Dienstprogramm-APIs aufgerufen org.mycompany.util.Numbers

Alle "Account" -spezifischen Geschäftsregeln, die APIs unterstützen, werden aufgerufen

org.mycompany.account.AccountHelper

Schließlich geht es darum, eine bessere Dokumentation und saubereren Code bereitzustellen.

Ringträger
quelle
5
Das scheint vernünftig, dass Helper spezifischer wäre als Utils.
KajMagnus
1
Ja, ich mag diesen Ansatz, er ist logischer.
Conan
3
Die Verbindung ist unterbrochen. Ich habe einen anderen gefunden .
Chavjoh
22

Ich mag die Konvention, dem Typnamen nur "s" hinzuzufügen, wenn der Typ eine Schnittstelle oder eine Klasse ist, die Sie nicht steuern. Beispiele hierfür im JDK sind Collectionsund Executors. Dies ist auch die in Google-Sammlungen verwendete Konvention.

Wenn Sie mit einer Klasse arbeiten, über die Sie die Kontrolle haben, würde ich sagen, dass Dienstprogrammmethoden im Allgemeinen zur Klasse selbst gehören.

ColinD
quelle
2
Google Guava verwendet auch dieses Muster
Jherico
11

Ich denke, dass 'utils' der Paketname sein sollte. Die Klassennamen sollten den Zweck der darin enthaltenen Logik angeben. Das Hinzufügen der sufix -util (s) ist redundant.

Aito
quelle
2
Dies wäre in einem "Paket für Feature" -Ansatz nicht das Richtige .
Jpangamarca
1
@jpangamarca Der Artikel, den Sie verlinkt haben, enthält jedoch ein "util" -Paket im Beispiel für "package by feature". Ich denke, in der Praxis kann eine Art Utility-Feature / Layer oft nicht vermieden werden.
Kapex
1
@kapex Ein Versehen des Autors, denke ich. Ein tld.organization.app.utilPaket sollte nicht existieren (könnte, sollte aber nicht), eine beliebige Anzahl von tld.organization.app.feature.utilPaketen ist vollkommen in Ordnung.
jpangamarca
3

Ich bin mir ziemlich sicher, dass die Wörter "Helfer" und "Dienstprogramme" synonym verwendet werden. Nach den von Ihnen angegebenen Beispielen zu urteilen, würde ich sagen, wenn Ihr Klassenname eine Abkürzung ist (oder Abkürzungen wie "DomUtil" enthält), dann rufen Sie Ihr Paket "Whatever.WhateverUtil" (oder Utils, wenn Ihr Paket mehr als ein Dienstprogramm enthält) auf ). Andernfalls, wenn es einen vollständigen Namen anstelle einer Abkürzung hat, nennen Sie es "Whatever.WhateverUtilities".

Es liegt wirklich an Ihnen, aber solange die Programmierer wissen, wovon Sie sprechen, können Sie loslegen. Wenn Sie dies professionell als Job für jemanden tun, fragen Sie ihn nach seinen Codierungsstandards, bevor Sie meinen Rat befolgen. Halten Sie sich immer an die Shop-Standards, egal was Ihnen dabei hilft, Ihren Job zu behalten. :-)

KSwift87
quelle