Никогда не говори никогда"
Я не думаю, что это обязательно плохо, это только плохо, если ты делаешь это плохо и злоупотребляешь этим.
Нам всем нужны инструменты и утилиты
Для начала, мы все используем некоторые библиотеки, которые иногда считаются почти повсеместными и обязательными. Например, в мире Java, Google Guava или некоторых из Apache Commons ( Apache Commons Lang , коллекции Apache Commons и т. Д.).
Так что в этом явно есть необходимость.
Избегайте грубых слов, дублирования и появления ошибок
Если вы думаете о них довольно много просто очень большой пучок этих Util
классов вы описываете, за исключением кто - то прошел через большие длины , чтобы получить их (относительно) право, и они были раз - проверены и сильно глаза сжались другими.
Поэтому я бы сказал, что первое эмпирическое правило, когда возникает желание написать Util
класс, - проверить, что Util
класс на самом деле еще не существует.
Единственный контраргумент, который я видел для этого, - это когда вы хотите ограничить свои зависимости, потому что:
- вы хотите ограничить объем памяти ваших зависимостей,
- или вы хотите строго контролировать то, что разработчикам разрешено использовать (это происходит в одержимых больших командах, или когда известна конкретная структура, имеющая нечетный класс супер-дерьма, которого где-то абсолютно избегают).
Но и то, и другое можно решить, переупаковав библиотеку с помощью ProGuard или ее эквивалента, или разобрав ее самостоятельно (для пользователей Maven , maven-shade-plugin предлагает несколько шаблонов фильтрации, чтобы интегрировать это как часть вашей сборки).
Так что, если он находится в lib и соответствует вашему варианту использования, и никакие тесты не говорят вам иначе, используйте его. Если это немного отличается от того, что вы, расширьте его (если возможно) или расширьте, или, в крайнем случае, перепишите его.
Соглашения об именах
Однако пока в этом ответе я назвал их Util
такими же как ты. Не называй их так.
Дайте им значимые имена. Возьмите Google Guava как (очень, очень) хороший пример того, что нужно делать, и просто представьте, что com.google.guava
пространство имен на самом деле является вашим util
корнем.
Назовите свой пакет util
, в худшем случае, но не классы. Если имеет дело с String
объектами и манипулированием строковыми конструкциями, называйте это Strings
, а не StringUtils
(извините, Apache Commons Lang - я все еще люблю и использую вас!). Если это что-то конкретное, выберите конкретное имя класса (например, Splitter
или Joiner
).
Модульный тест
Если вам нужно прибегнуть к написанию этих утилит, обязательно протестируйте их. Преимущество утилит в том, что они, как правило, представляют собой автономные компоненты, которые принимают определенные входные данные и возвращают конкретные выходные данные. Это концепция. Так что нет никаких оснований не тестировать их.
Кроме того, модульное тестирование позволит вам определить и задокументировать контракт их API. Если тесты не работают, либо вы что-то изменили неправильно, либо это означает, что вы пытаетесь изменить контракт вашего API (или что ваши первоначальные тесты были дерьмовыми - учитесь на этом, и не делайте этого снова) .
API дизайн
Решение о дизайне, которое вы примете для этих API, будет следовать за вами, возможно, долгое время. Поэтому, не тратя часов на написание Splitter
-clone, будьте осторожны с подходом к решению проблемы.
Задайте себе несколько вопросов:
- Ваш вспомогательный метод гарантирует класс сам по себе или статический метод достаточно хорош, если имеет смысл для него быть частью группы аналогично полезных методов?
- Вам нужны фабричные методы, чтобы создавать объекты и делать ваши API более читабельными?
- Говоря о читабельности, вам нужен Fluent API , компоновщики и т. Д.?
Вы хотите, чтобы эти утилиты охватывали широкий спектр вариантов использования, были надежными, стабильными, хорошо документированными, следовали принципу наименьшего удивления и были автономными. В идеале каждый подпакет ваших утилит, или, по крайней мере, весь ваш пакет утилит, должен быть экспортирован в пакет для простого повторного использования.
Как обычно, учитесь у гигантов здесь:
- Просмотрите их, затем проанализируйте и сравните, и возвращайтесь к ним часто, чтобы сделать это снова (обратите внимание, что я не делаю никакого суждения о том, являются ли они абсолютно или частично хорошими или плохими, акцент делается на немного анализировать и сравнивать ) :
- Посмотрите, как разрабатывает хороший API Джош Блох и почему это важно ( слайды ).
- Прочитайте и посмотрите дополнительные материалы Блоха:
- Читайте вопросы разработки API .
Да, многие из них делают акцент на коллекциях и структурах данных, но не говорите мне, что это не то, где или для чего вы обычно реализуете большинство своих утилит, прямо или косвенно.
Util
в именах ваших классов. Проблема решена.