В чем разница между классами Helper и Utility?

116

Как определить, как вызвать класс XHelper или XUtils?

На мой взгляд :

Вспомогательный класс - это класс, который может быть создан и выполнять некоторую бизнес-работу.

Класс Utils - это статический класс, который выполняет небольшие и повторяющиеся операции над экземпляром определенного типа (пример классов utils ArrayUtils или IOUtils от Apache)

Jakcam
источник
5
«Деловая работа» - вот ключевое различие. Я считаю его полезным соглашением Utilsдля статического класса, который можно использовать где угодно в организации или в другой организации. У Helperкласса есть общий код, который можно повторно использовать в проекте, и он имеет зависимости внутри проекта. Конечно, общепринятого правила нет, но я считаю это полезным.
Стивен Хоскинг,
1
@StephenHosking: Ваше объяснение наиболее убедительно для меня и, возможно, для всех. Если возможно, разместите свое объяснение как фактический ответ на этот пост, а не просто оставьте комментарий.
Bigair
@Bigair. Спасибо, но это всего лишь предложение, а не ответ. Я рад, что люди нашли это полезным.
Стивен Хоскинг

Ответы:

102

Есть много стилей именования. Я бы предложил Utils только потому, что он более распространен.

Подразумевается, что служебный класс имеет только статические методы и не имеет состояния. Вы бы не стали создавать экземпляр такого класса.

Помощник может быть служебным классом, иметь состояние или требовать создания экземпляра. Я бы по возможности избегал этого.

Если можете, уточните название. например, если у него есть методы сортировки, сделайте его XSorter

Для массивов вы можете найти вспомогательные классы, такие как

Array
Arrays
ArrayUtil
ArrayUtils
ArrayHelper

Кстати, сокращение для служебного класса - это перечисление без экземпляров

enum XUtils {;
    static methods here
}

Если вам нужно реализовать интерфейс, я бы использовал синглтон без сохранения состояния.

enum XHelper implements RequiredInterface {
   INSTANCE;
   // no instance fields.
}
Питер Лоури
источник
В этом сообщении stackoverflow.com/a/2135797/787698 говорится, что Xutils - это статический класс без зависимостей. Что ты думаешь об этом?
jakcam
@jakcam Интересный момент. Помощник может иметь состояние и требовать экземпляр. Если возможно, я бы использовал служебный класс без состояния и без экземпляра.
Питер Лоури
Что вы понимаете под Xutils - это статический класс без зависимостей ?
jakcam
Я не могу найти в этом сообщении «xutils» или «никаких зависимостей».
Питер Лоури
1
@John В этом случае служебный метод нежелателен, так как его сложнее смоделировать для целей тестирования.
Питер Лоури
16

В основном? Это совершенно произвольно. Для этого нет никаких правил.

Джеспер
источник
8

Утилита - это класс общего использования "листовой узел". То есть он не имеет никаких зависимостей в вашем проекте и может быть перенесен из проекта в проект, не ломаясь и не становясь бесполезным. Примеры: Vector3, RandomNumberGenerator, StringMatcher, и т.д. ...

«Помощником» может быть любой класс, созданный для помощи другому классу. Это может зависеть или не зависеть от вашего проекта. Если вы создаете GameNetworkClientкласс, вы можете сказать, что он GameNetworkConnectionявляется «помощником», потому что он «помогает» классу GameNetworkClient.

То, как разработчики относятся к инструментам, отражает обычное употребление этих слов. Если вы можете вспомнить слуховые аппараты, описанные как «полезные» и «полезные», полезный инструмент имеет некоторый контекст (терка для сыра помогает натирать сыр, устройство для зачистки кукурузы помогает снимать кукурузу, скорострельный погрузчик помогает перезарядить огнестрельное оружие). Ожидается, что "утилита" будет работать в самых разных контекстах (WD-40, клейкая лента, армейские ножи, клей, фонарик и т. Д.).

Джеймс М. Лэй
источник
5

Как сказал Джеспер, это совершенно произвольно . Вы можете подумать о том, что работает для вашей организации, и сделать это условием.

Для меня это примерно так:

utils - Статический класс, который можно свободно перемещать и импортировать куда угодно.

Выполнение общих задач, которые могут быть полезны в разных модулях. Как сказал Питер Лоури, полезны более конкретные имена .

helper - Класс, помогающий другому классу или модулю.

Задачи, которые используются только в том модуле, в котором они размещены, и не имеют смысла для импорта в другое место. Следовательно, имя может быть более конкретным - ModuleName Helper (например, AdministrationHelper , LoginHelper )

тифон04
источник
2

На это нет окончательного ответа. Придумайте одну схему именования и придерживайтесь ее. Присвоение имен вашим пакетам и классам - важная часть архитектуры программного обеспечения, и никто не может лишить вас этого решения.

Мне лично больше нравится XHelper, но я чаще вижу XUtils в чужом коде.

Мне также нравится схема именования во множественном числе, которую вы найдете как в JDK, так и в Guava :

если класс имеет дело с Collectionобъектами, он называетсяCollections

Массив> Массивы (jdk)
Список> Списки (гуава)
Карта> Карты (гуава)

и т.п.

Шон Патрик Флойд
источник