Sag niemals nie"
Ich denke nicht, dass es notwendigerweise schlecht ist, es ist nur schlecht, wenn man es schlecht macht und es missbraucht.
Wir alle brauchen Werkzeuge und Hilfsprogramme
Für den Anfang benutzen wir alle einige Bibliotheken, die manchmal als fast allgegenwärtig und unverzichtbar angesehen werden. Zum Beispiel in der Java-Welt Google Guava oder einige von Apache Commons ( Apache Commons Lang , Apache Commons Collections , etc ...).
Es besteht also eindeutig ein Bedarf für diese.
Vermeiden Sie Hard-Word, Vervielfältigung und das Einführen von Fehlern
Wenn Sie über diese denken , sind ziemlich einfach ein sehr großer Haufen dieser Util
Klassen , die Sie beschreiben, außer jemand durch den großen Längen ging sie (relativ) Recht zu bekommen, und sie haben schon Zeit - getestet und stark ins Auge geballt durch andere.
Ich würde also sagen, die erste Faustregel beim Schreiben einer Util
Klasse ist, zu überprüfen, ob die Util
Klasse tatsächlich noch nicht existiert.
Das einzige Gegenargument, das ich dafür gesehen habe, ist, wenn Sie Ihre Abhängigkeiten begrenzen möchten, weil:
- Sie möchten den Speicherbedarf Ihrer Abhängigkeiten begrenzen,
- oder Sie möchten genau kontrollieren, welche Entwickler verwendet werden dürfen (dies geschieht in obsessiven großen Teams, oder wenn ein bestimmtes Framework dafür bekannt ist, dass die eine oder andere super beschissene Klasse irgendwo absolut zu meiden ist).
Beides kann jedoch gelöst werden , indem Sie die Bibliothek mit ProGuard oder einem gleichwertigen Programm neu packen oder selbst zerlegen (für Maven- Benutzer bietet das Maven-Shade-Plugin einige Filtermuster , um diese in Ihren Build zu integrieren).
Wenn es sich also in einer Bibliothek befindet und mit Ihrem Anwendungsfall übereinstimmt und kein Benchmark etwas anderes angibt, verwenden Sie es. Wenn es ein bisschen von dem abweicht, was Sie tun, erweitern Sie es (wenn möglich) oder erweitern Sie es, oder schreiben Sie es in letzter Instanz neu.
Regeln der Namensgebung
Bisher habe ich sie jedoch so genannt Util
wie Sie. Nennen Sie sie nicht so.
Geben Sie ihnen aussagekräftige Namen. Nehmen Sie Google Guava als (sehr, sehr) gutes Beispiel, und stellen Sie sich vor, dass der com.google.guava
Namespace tatsächlich Ihre util
Wurzel ist.
Nennen Sie Ihr Paket util
im schlimmsten Fall, aber nicht die Klassen. Wenn es um String
Objekte und die Manipulation von String-Konstrukten geht, nennen Sie es Strings
nicht StringUtils
(Entschuldigung, Apache Commons Lang - ich mag und benutze Sie immer noch!). Wenn es etwas Bestimmtes tut, wähle einen bestimmten Klassennamen (wie Splitter
oder Joiner
).
Gerätetest
Wenn Sie auf das Schreiben dieser Dienstprogramme zurückgreifen müssen, stellen Sie sicher, dass Sie diese Unit-Tests durchführen. Das Gute an Dienstprogrammen ist, dass es sich in der Regel um eigenständige Komponenten handelt, die bestimmte Eingaben annehmen und bestimmte Ausgaben zurückgeben. Das ist das Konzept. Es gibt also keine Entschuldigung, sie nicht einmal zu testen.
Durch Unit-Tests können Sie auch den API-Vertrag definieren und dokumentieren. Wenn die Tests abbrechen, haben Sie entweder etwas falsch geändert, oder Sie versuchen, den API-Vertrag zu ändern (oder Ihre ursprünglichen Tests waren Mist - lernen Sie daraus und wiederholen Sie sie nicht) .
API-Design
Die Designentscheidungen, die Sie für diese APIs treffen, werden Ihnen möglicherweise noch lange folgen. Splitter
Seien Sie also vorsichtig , wenn Sie sich nicht stundenlang mit dem Schreiben eines Klons beschäftigen.
Stellen Sie sich einige Fragen:
- Gewährleistet Ihre Dienstprogrammmethode eine Klasse für sich oder ist eine statische Methode ausreichend, wenn es sinnvoll ist, Teil einer Gruppe ähnlich nützlicher Methoden zu sein?
- Benötigen Sie Factory-Methoden , um Objekte zu erstellen und Ihre APIs besser lesbar zu machen?
- Wo wir gerade von Lesbarkeit sprechen: Benötigen Sie eine Fluent-API , Builder usw.?
Sie möchten, dass diese Tools eine große Bandbreite von Anwendungsfällen abdecken, robust, stabil, gut dokumentiert und nach dem Prinzip der geringsten Überraschung in sich geschlossen sind. Im Idealfall kann jedes Unterpaket Ihrer Utils oder zumindest Ihr gesamtes Util-Paket zur einfachen Wiederverwendung in ein Bundle exportiert werden.
Lernen Sie hier wie gewohnt von Riesen:
- Durchsuchen Sie diese, analysieren und vergleichen Sie sie dann und kehren Sie oft zurück, um es erneut zu tun (beachten Sie, dass ich keine Beurteilung darüber vornehme, ob diese absolut oder teilweise gut oder schlecht sind, der Schwerpunkt liegt auf dem Analyse- und Vergleichsbit ) :
- Sehen Sie, wie Josh Bloch eine gute API entwirft und warum es wichtig ist ( Folien ).
- Lesen und schauen Sie sich zusätzliches Bloch-Material an:
- Lesen Sie API Design Matters .
Ja, viele davon konzentrieren sich auf Sammlungen und Datenstrukturen, aber sagen Sie mir nicht, dass dies nicht der Ort oder das Ziel ist, an dem Sie die meisten Ihrer Utils normalerweise direkt oder indirekt implementieren.
Util
in den Namen Ihrer Klassen. Problem gelöst.