Eu sempre tenho problemas para descobrir se devo nomear um determinado método começando com getSomething
versus findSomething
.
O problema reside na criação de auxiliares para APIs mal projetadas. Isso geralmente ocorre ao obter dados de um objeto, o que requer o objeto como parâmetro. Aqui está um exemplo simples:
public String getRevision(Item item) {
service.load(item, "revision");
// there is usually more work to do before getting the data..
try {
return item.get_revision();
}
catch(NotLoadedException exception) {
log.error("Property named 'property_name' was not loaded", exception);
}
return null;
}
Como e por que decidir entre nomear esse método como getRevision()
ou findRevision()
?
Respostas:
Uso
Get
quando sei que o tempo de recuperação será muito curto (como em uma pesquisa de uma tabela de hash ou btree).Find
implica um processo de pesquisa ou algoritmo computacional que requer um período de tempo "mais longo" para ser executado (por algum valor arbitrário de mais tempo).fonte
find
por um algoritmo de tabela de hash posteriormente?get
efind
se aplica, dependendo de como é usado.Eu diria que isso
find
pode falhar, masget
não deveria.fonte
find
pode retornar NULL enquantoget
nunca retornará NULL, mas pode lançar (ou afirmar), eu concordo.find()
retornosOptional<>
? Nesse caso,find
também énull
seguro.Para citar uma conversa que geralmente tenho com meus filhos:
A mesma idéia vale:
use "get" para um método que retorna uma informação disponível mais barata (e provavelmente pode ser incorporada ou otimizada) ou para uma informação pertencente exclusivamente a esse objeto.
use "find" para um método que funciona para obter uma informação ou usa outros objetos para encontrá-la.
fonte
Encontrar implica não ter o resultado, como ao executar uma consulta ao banco de dados com alguns parâmetros que podem mudar entre as chamadas. Get, por outro lado, implica que os resultados são conhecidos pelo método antecipadamente ou não serão alterados uma vez conhecidos, que não há parâmetros para a chamada.
Então, eu usaria, por exemplo, Customer findCustomerById (long customerId) e Customer getCustomer ()
fonte
Eu aplico o seguinte padrão:
Foo GetFoo()
não pode retornar nulo e sua complexidade é O (log (n)) ou menorbool TryGetFoo(out Foo)
pode retornar nulo e sua complexidade é O (log (n)) ou menorFoo FindFoo()
não pode retornar nulo e sua complexidade é maior que O (log (n))bool TryFindFoo(out Foo)
pode retornar nulo e sua complexidade é maior que O (log (n))Dessa forma, o código é bem claro sobre a intenção e a complexidade que você pode esperar.
Normalmente, os Getters são para acesso direto à lista ou dicionário / conjunto.
Os Finders são pesquisa profunda, varredura completa da lista, etc ...
No seu caso:
fonte
try
, curto e precisoget
é apropriado em qualquer caso _ de fato, é geralmente assumido que, para obter algo, você precisa encontrá-lo primeiro. Então, se você não tiver certeza, useget
.Eu usaria
find
métodos comofindMinimum()
oufindOptimal()
, ou seja, onde existe algum algoritmo especial que calcula o valor de retorno, e não faz simplesmente uma solicitação ao DB, sistema de arquivos, servidor remoto, etc. para receber alguns dados.fonte
find
como prefixo nos exemplos que você forneceu. Para tarefas computacionais, como as do seu exemplo, eu usariacalculate
orcompute
.Não use encontrar ou obter prefixos. Isso é uma violação do UniformAccessPrinciple, criado por bertrand meyer. Por que não criar um método como o seguinte:
fonte
Geralmente usarei
Get
para recuperar um objeto / valor eFind
recuperar sua localização (em uma matriz, por exemplo).por ex:
fonte
Para mim,
find
implica que pode haver mais de um resultado presente.get
implica apenas um.fonte
getCat
vsfindCat
vsgetCats
vsfindCats
. Ofind..
ainda representa objetos singulares sendo retornados. O plural deve ser adicionado ao substantivo, na minha opinião.