Nigdy nie mów nigdy"
Nie sądzę, że to musi być złe, tylko źle, jeśli zrobisz to źle i nadużyjesz.
Wszyscy potrzebujemy narzędzi i narzędzi
Na początek wszyscy używamy bibliotek, które czasami są uważane za prawie wszechobecne i niezbędne. Na przykład w świecie Java, Google Guava lub niektórych Apache Commons ( Apache Commons Lang , Apache Commons Collections itp.).
Tak więc wyraźnie jest taka potrzeba.
Unikaj twardych słów, powielania i wprowadzania błędów
Jeśli myślisz o nich dość dużo po prostu bardzo duże grono tych Util
klas można opisać, chyba ktoś przeszedł wiele trudu, aby je (stosunkowo) prawo, a oni byli razem - przetestowany i mocno przyciągające zaciskał przez innych.
Powiedziałbym więc, że pierwszą zasadą przy odczuciu swędzenia pisania Util
zajęć jest sprawdzenie, czy Util
klasa faktycznie nie istnieje.
Jedynym kontrargumentem, jaki widziałem, jest to, że chcesz ograniczyć swoje zależności, ponieważ:
- chcesz ograniczyć ślad pamięci swoich zależności,
- lub chcesz ściśle kontrolować, z czego mogą korzystać programiści (dzieje się to w obsesyjnych dużych zespołach lub gdy znany jest konkretny framework posiadający dziwną super-gównianą klasę, której absolutnie gdzieś trzeba unikać).
Ale z obydwoma tymi problemami można zająć się ponownie pakując bibliotekę przy użyciu ProGuard lub jej odpowiednika, lub osobiście ją rozłączając (dla użytkowników Maven wtyczka maven-shadow-plug oferuje pewne wzorce filtrowania, aby zintegrować to jako część twojej kompilacji).
Więc jeśli jest w wersji lib i pasuje do twojego przypadku użycia, a żadne testy porównawcze nie wskazują inaczej, użyj go. Jeśli różni się on nieco od tego, co przedłużysz, przedłuż go (jeśli to możliwe) lub przedłuż, albo w ostateczności przepisz go.
Konwencje nazewnictwa
Jednak do tej pory w tej odpowiedzi nazwałem ich Util
podobnymi do ciebie. Nie nazywaj ich tak.
Nadaj im sensowne nazwy. Weź Google Guava jako (bardzo, bardzo) dobry przykład tego, co należy zrobić, i wyobraź sobie, że com.google.guava
przestrzeń nazw jest tak naprawdę Twoim util
katalogiem głównym.
Zadzwoń do swojego pakietu util
, w najgorszym wypadku, ale nie do klas. Jeśli dotyczy String
obiektów i manipulacji konstruktów smyczkowych, nazwać Strings
, a nie StringUtils
(przepraszam, Apache Commons Lang - nadal lubię cię i używać!). Jeśli robi coś konkretnego, wybierz nazwę konkretnej klasy (jak Splitter
lub Joiner
).
Test jednostkowy
Jeśli musisz użyć tych narzędzi, przetestuj je. Zaletą narzędzi jest to, że zwykle są to raczej samodzielne komponenty, które pobierają określone dane wejściowe i zwracają określone dane wyjściowe. To jest koncepcja. Nie ma więc wymówki, aby ich nie testować jednostkowo.
Ponadto testy jednostkowe pozwolą ci zdefiniować i udokumentować umowę API. Jeśli testy zakończą się, albo zmieniłeś coś w niewłaściwy sposób, albo oznacza to, że próbujesz zmienić umowę API (lub że twoje oryginalne testy były badziewne - ucz się z tego i nie rób tego ponownie) .
Projektowanie interfejsu API
Decyzje projektowe, które podejmiesz dla tych interfejsów API, prawdopodobnie podążą za tobą długo. Tak więc, nie poświęcając godzin na pisanie Splitter
-klonu, uważaj na swoje podejście do problemu.
Zadaj sobie kilka pytań:
- Czy twoja metoda użyteczności gwarantuje samą klasę, czy też metoda statyczna jest wystarczająco dobra, jeśli ma sens, aby była częścią grupy podobnie użytecznych metod?
- Czy potrzebujesz fabrycznych metod do tworzenia obiektów i zwiększenia czytelności interfejsów API?
- Mówiąc o czytelności, potrzebujesz płynnego interfejsu API , konstruktorów itp.?
Chcesz, aby te narzędzia obejmowały szeroki wachlarz przypadków użycia, były solidne, stabilne, dobrze udokumentowane, zgodnie z zasadą najmniejszego zaskoczenia i były niezależne. Idealnie byłoby, gdyby każdy podpakiet twoich narzędzi, lub przynajmniej cały pakiet użytkowy, mógł zostać wyeksportowany do pakietu w celu łatwego ponownego użycia.
Jak zwykle ucz się od gigantów tutaj:
Tak, wiele z nich kładzie nacisk na kolekcje i struktury danych, ale nie mów mi, że nie jest to miejsce lub po co zwykle możesz wdrożyć większość swoich narzędzi, bezpośrednio lub pośrednio.
Util
w nazwach swoich klas. Problem rozwiązany.