Quais são as diferenças entre as classes Helper e Utility?

115

Como determinar como chamar uma classe XHelper ou XUtils?

Para minha mente :

Classe auxiliar , é uma classe que pode ser instanciada e fazer algum trabalho de negócios

Classe Utils , é uma classe estática que executa pequenas e repetitivas operações em um tipo de instância (exemplo de classes utils ArrayUtils ou IOUtils do Apache)

Jakcam
fonte
5
"Trabalho de negócios" é a distinção chave aqui. Acho que é uma convenção útil para usar Utilsem uma classe estática que pode ser usada em qualquer lugar na organização ou em outra organização. Uma Helperclasse possui um código comum que pode ser reutilizado dentro de um projeto e possui dependências dentro do projeto. Claro, não existe uma regra geralmente aceita, mas acho isso útil.
Stephen Hosking
1
@StephenHosking Sua explicação é a mais convincente para mim e talvez para todos. Se possível, você postaria sua explicação como uma resposta real a esta postagem ao invés de apenas como um comentário.
Bigair de
@Bigair. Obrigado, mas o meu é apenas uma sugestão, não uma resposta. Fico feliz que as pessoas achem isso útil.
Stephen Hosking,

Respostas:

101

Existem muitos estilos de nomenclatura a serem usados. Eu sugeriria Utils apenas porque é mais comum.

Uma classe Utility é entendida como tendo apenas métodos estáticos e sem estado. Você não criaria uma instância de tal classe.

Um Helper pode ser uma classe de utilitário ou pode ter estado ou exigir que uma instância seja criada. Eu evitaria isso, se possível.

Se você puder tornar o nome mais específico. por exemplo, se tiver métodos de classificação, torne-o XSorter

Para matrizes, você pode encontrar classes auxiliares como

Array
Arrays
ArrayUtil
ArrayUtils
ArrayHelper

BTW, uma abreviatura para uma classe de utilitário é um enum sem instâncias

enum XUtils {;
    static methods here
}

Se você precisar implementar uma interface, eu usaria um Singleton sem estado.

enum XHelper implements RequiredInterface {
   INSTANCE;
   // no instance fields.
}
Peter Lawrey
fonte
Neste post stackoverflow.com/a/2135797/787698 , que Xutils é uma classe estática sem dependências. O que você está pensando sobre isso?
jakcam
@jakcam Ponto interessante. Um auxiliar pode ter estado e exigir uma instância. Eu usaria uma classe de utilitário sem estado e sem instância, se possível.
Peter Lawrey
O que você entende por Xutils como uma classe estática sem dependências ?
jakcam de
Não consigo encontrar "xutils" ou "sem dependências" nesse post.
Peter Lawrey
1
@John Nesse caso, um método utilitário não é desejável, pois é mais difícil de simular para fins de teste.
Peter Lawrey
16

Em geral? É totalmente arbitrário. Não existem regras para isso.

Jesper
fonte
8

Um utilitário é uma classe de "nó folha" de uso geral. Ou seja, ele não tem nenhuma dependência em seu projeto e pode ser portado de um projeto para outro sem quebrar ou se tornar inútil. Exemplos: Vector3, RandomNumberGenerator, StringMatcher, etc ...

Um "ajudante" parece ser qualquer classe cujo design é ajudar outra classe. Isso pode ou não depender do seu projeto. Se você estiver criando uma GameNetworkClientclasse, pode dizer que a GameNetworkConnectionclasse é um 'ajudante', porque "ajuda" o GameNetworkClient.

A forma como os desenvolvedores se referem às ferramentas reflete o uso comum dessas palavras. Se você se lembra de ferramentas auditivas descritas como "úteis" versus "úteis", uma ferramenta útil tende a ter algum contexto (o ralador de queijo ajuda a ralar o queijo, o removedor de milho ajuda a descascar o milho, o carregador rápido ajuda a recarregar uma arma de fogo). Espera-se que um "utilitário" funcione em uma variedade de contextos (WD-40, fita adesiva, canivetes, cola, lanterna, etc ...).

James M. Lay
fonte
4

Como disse Jesper, é totalmente arbitrário . Você pode pensar no que funciona para sua organização e fazer disso a convenção.

Para mim, é algo assim:

utils - Classe estática, que pode ser livremente movida e importada para qualquer lugar.

Fazer tarefas gerais que podem ser úteis em diferentes módulos. Como disse Peter Lawrey, nomes mais específicos são úteis.

helper - Aula ajudando outra classe ou módulo.

Tarefas que são usadas apenas no módulo em que estão localizadas e não farão sentido serem importadas para outro lugar. Portanto, o nome pode ser mais específico - ModuleName Helper (por exemplo , AdministrationHelper , LoginHelper )

typhon04
fonte
2

Não há uma resposta definitiva para isso. Descubra um esquema de nomenclatura e siga-o. Nomear seus pacotes e classes é uma parte importante da arquitetura de software e ninguém pode tirar essa decisão de você.

Eu pessoalmente gosto mais do XHelper, mas vejo XUtils com mais frequência em código estrangeiro.

Também gosto do esquema de nomenclatura "plural" que você encontrará no JDK e no Guava :

se uma classe lida com Collectionobjetos, é chamadaCollections

Matriz> Arrays (jdk)
Lista> Listas (goiaba)
Mapa> Mapas (goiaba)

etc.

Sean Patrick Floyd
fonte