Como e por que decidir entre os métodos de nomeação com os prefixos “get” e “find”

40

Eu sempre tenho dificuldade em descobrir se devo nomear um determinado método começando com getSomething versus findSomething .

O problema reside na criação de ajudantes para APIs mal projetadas. Isso geralmente ocorre ao obter dados de um objeto, o que requer o objeto como um 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() ?

    
por knownasilya 09.01.2013 / 22:36
fonte

9 respostas

74

Eu 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 em um processo de pesquisa ou algoritmo computacional que requer um período de tempo "mais longo" para executar (por algum valor arbitrário maior).

    
por 09.01.2013 / 22:50
fonte
53

Eu diria que find pode falhar, mas get não deveria.

    
por 09.01.2013 / 22:51
fonte
35

Para citar uma conversa que tenho frequentemente com os meus filhos:

me: Hey kid! Go find me some batteries

kid: But where are they?

me: That's why I told you to go find them. If I knew where they were, I would have told you to go get them. Or you could ask your mother.

A mesma ideia é válida:

  • use "get" para um método que retorna uma informação barata disponível (e provavelmente pode ser embutida ou otimizada), ou para uma informação pertencente exclusivamente a este objeto.

  • use "localizar" para um método que funcione para obter uma informação ou use outros objetos para encontrá-la.

por 22.01.2013 / 16:19
fonte
3

Localizar implica não ter o resultado, como ao executar uma consulta de banco de dados com alguns parâmetros que podem mudar entre as chamadas. Obter, por outro lado, implica que os resultados são conhecidos pelo método de antemão ou não vão mudar uma vez conhecidos, que não há parâmetros para a chamada.
Então, eu usaria por exemplo Customer findCustomerById (customerId longo) e Customer getCustomer ()

    
por 10.01.2013 / 10:00
fonte
3

Eu aplico o seguinte padrão:

  • Foo GetFoo() não pode retornar null e sua complexidade é O (log (n)) ou menor
  • bool TryGetFoo(out Foo) pode retornar nulo e sua complexidade é O (log (n)) ou menor
  • Foo FindFoo() não pode retornar nulo e sua complexidade é maior que O (log (n))
  • bool TryFindFoo(out Foo) pode retornar null 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, verificação completa da lista, etc ...

No seu caso:

public bool TryGetRevision( Item item, out String revision ) 
{
    service.load( item, "revision" );
    // there is usually more work to do before getting the data..
    try 
    {
        revision = item.get_revision();
        return true;
    }
    catch( NotLoadedException exception )
    {
        log.error( "Property named 'property_name' was not loaded", exception );
        revision = "";
        return false;
    }
}
    
por 29.01.2013 / 16:00
fonte
2

get é apropriado em qualquer caso - na verdade, é comum supor que, para obter algo, você precisa encontrá-lo primeiro. Então, se você não tiver certeza, use get .

Eu usaria find para métodos como findMinimum() ou findOptimal() , ou seja, onde há algum algoritmo especial que calcula o valor de retorno e não faz simplesmente uma solicitação ao banco de dados, sistema de arquivos, servidor remoto , etc. para receber alguns dados.

    
por 09.01.2013 / 22:43
fonte
2

Não use encontrar ou obter prefixos. Isso é uma violação do UniformAccessPrinciple cunhado por bertrand meyer. Por que não criar um método como o seguinte:

public String revision(Item item)
    
por 29.10.2017 / 12:44
fonte
1

Geralmente usarei Get para recuperar um objeto / valor e Find para recuperar sua localização (em uma matriz, por exemplo).

por ex:

object o = obj.GetItem( 'name');

integer i = somearray.Find( 'name');
    
por 29.01.2013 / 18:30
fonte
0

Para mim, find implica que possivelmente pode haver mais de um resultado presente. get implica apenas um.

    
por 09.01.2013 / 22:40
fonte