Ніколи не кажи ніколи"
Я не думаю, що це обов'язково погано, це тільки погано, якщо ти робиш це погано і зловживаєш цим.
Нам усім потрібні інструменти та утиліти
Для початку всі ми використовуємо деякі бібліотеки, які іноді вважаються майже всюдисущими і обов'язковими. Наприклад, у світі Java, Гуава Google або частина Apache Commons ( Apache Commons Lang , Apache Commons Collection тощо).
Тож явно в цьому є потреба.
Уникайте помилок, копіювання та введення помилок
Якщо ви думаєте про них досить багато просто дуже великий пучок цих Util
класів ви описуєте, за винятком хто - то пройшов через великі довжини , щоб отримати їх (відносно) право, і вони були раз - перевірені і сильно очі звузилися іншими.
Тому я б сказав, що перше правило, коли відчуваються свербіж, щоб написати Util
клас - це перевірити, що Util
клас насправді ще не існує.
Єдиний зустрічний аргумент, який я бачив, - це коли ви хочете обмежити свої залежності, оскільки:
- ви хочете обмежити слід пам'яті ваших залежностей,
- або ви хочете жорстко контролювати те, що розробникам дозволено використовувати (це трапляється в нав’язливих великих командах, або коли відомий конкретний фреймворк для того, щоб мати дивний супер-хитрий клас, щоб його абсолютно кудись уникати).
Але обидва з них можна вирішити, повторно упакувавши вкладку за допомогою програми ProGuard або іншого еквівалента, або розібравши її самостійно (для користувачів Maven , плагін maven-shadow пропонує кілька моделей фільтрації, щоб інтегрувати це як частину вашої збірки).
Отже, якщо він знаходиться в lib і відповідає вашому випадку використання, і жоден тест не говорить про інше, використовуйте його. Якщо він дещо відрізняється від того, що ви маєте, продовжте його (якщо можливо) або продовжте або в крайньому випадку перепишіть його.
Названня конвенцій
Однак поки що у цій відповіді я називав їх Util
такими, як ти. Не називайте їх так.
Дайте їм значущі імена. Візьміть Google Guava як (дуже-дуже) хороший приклад того, що робити, і просто уявіть, що com.google.guava
простір імен насправді є вашим util
коренем.
Зателефонуйте в пакет util
, в гіршому випадку, але не в класи. Якщо ви маєте справу з String
об'єктами та маніпулюванням струнних конструкцій, називайте це Strings
, а не StringUtils
(вибачте, Apache Commons Lang - я все одно люблю і використовую вас!). Якщо це робить щось конкретне, виберіть конкретне ім’я класу (наприклад, Splitter
або Joiner
).
Блок-тест
Якщо вам доведеться вдатися до написання цих утиліт, переконайтесь, що випробовуєте їх. Хороша річ утиліт - це те, що вони, як правило, є автономними компонентами, які беруть конкретні входи та повертають конкретні результати. Така концепція. Тож немає приводу, щоб не перевірити їх.
Крім того, тестування підрозділу дозволить визначити та задокументувати контракт їх API. Якщо тести зламатися, або ви змінили що - то неправильно, або це означає , що ви намагаєтеся змінити контракт вашого API, (або , що ваші початкові тести були лайном - дізнатися від нього, і не робити це знову) .
Дизайн API
Проектне рішення, яке ви приймете для цих API, буде довго наслідувати вас, можливо. Тож, не витрачаючи годин на написання Splitter
-клону, будьте обережні, як ви підходите до проблеми.
Задайте собі кілька питань:
- Чи гарантує ваш корисний метод самостійно клас чи достатньо хороший статичний метод, якщо він має сенс бути частиною групи аналогічно корисних методів?
- Вам потрібні фабричні методи для створення об’єктів та підвищення API для читання?
- Якщо говорити про читабельність, чи потрібні вам Fluent API , будівельники тощо ...?
Ви хочете, щоб ці утиліти охоплювали велику ширину випадків використання, були надійними, стабільними, добре задокументованими, дотримуючись принципу найменшого здивування, і були самодостатніми. В ідеалі кожен підпакет ваших утилітів або принаймні весь ваш пакунок утилітів повинен бути експортований у комплект для легкого повторного використання.
Як завжди, вчимося у гігантів тут:
- Просійте їх, потім проаналізуйте та порівняйте та повертайтеся до них часто, щоб зробити це знову (зауважте, що я не приймаю жодних суджень про те, чи є вони абсолютно або частково хорошими чи поганими, акцент робиться на аналізі та порівнянні біт) :
- Дивіться, як Джош Блох розробив хороший API і чому це має значення ( слайди ).
- Прочитайте та перегляньте кілька додаткових матеріалів Блоха:
- Прочитайте питання дизайну API .
Так, багато хто з них роблять акцент на колекціях та структурах даних, але не кажіть мені, що ви там не де чи для чого, як правило, реалізуєте більшість своїх утиліт прямо чи опосередковано.
Util
назви своїх класів. Проблема вирішена.