Cómo y por qué decidir entre nombrar métodos con los prefijos "obtener" y "encontrar"

40

Siempre tengo problemas para averiguar si debo nombrar un determinado método comenzando con getSomething versus findSomething .

El problema reside en la creación de ayudantes para las API mal diseñadas. Esto suele ocurrir cuando se obtienen datos de un objeto, que requiere que el objeto sea un parámetro. Aquí hay un ejemplo simple:

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;
}

¿Cómo y por qué decidir entre nombrar este método como getRevision() o findRevision() ?

    
pregunta knownasilya 09.01.2013 - 22:36

9 respuestas

74

Utilizo Get cuando sé que el tiempo de recuperación será muy corto (como en una búsqueda desde una tabla hash o btree).

Find implica un proceso de búsqueda o algoritmo computacional que requiere un período de tiempo "más largo" para ejecutar (para un valor arbitrario de más tiempo).

    
respondido por el Robert Harvey 09.01.2013 - 22:50
52

Yo diría que find puede fallar pero get no debería.

    
respondido por el coredump 09.01.2013 - 22:51
35

Para citar una conversación que a menudo tengo con mis hijos:

  

yo: ¡Oye, niño! Ve a buscarme algunas pilas

     

niño: ¿Pero dónde están?

     

yo: Por eso te dije que fueras a encontrarlos . Si supiera dónde están, te habría dicho que vayas a obtener a ellos. O puedes preguntarle a tu madre.

La misma idea sostiene:

  • use "get" para un método que devuelva información accesible de forma económica (y probablemente pueda estar en línea u optimizada de otra manera), o para obtener información que sea propiedad exclusiva de este objeto.

  • use "buscar" para un método que funcione para obtener información o use otros objetos para encontrarla.

respondido por el jimwise 22.01.2013 - 16:19
3

Buscar implica no tener el resultado, como cuando se ejecuta una consulta de base de datos con algunos parámetros que pueden cambiar entre llamadas. Obtener, por otro lado, implica que los resultados son conocidos por el método de antemano o que no cambiarán una vez que se conozcan, que no hay parámetros para la llamada.
Por lo tanto, usaría, por ejemplo, Customer findCustomerById (long customerId) y Customer getCustomer ()

    
respondido por el jwenting 10.01.2013 - 10:00
3

Aplico el siguiente patrón:

  • Foo GetFoo() no puede devolver nulo y su complejidad es O (log (n)) o menos
  • bool TryGetFoo(out Foo) puede devolver nulo y su complejidad es O (log (n)) o menos
  • Foo FindFoo() no puede devolver nulo y su complejidad es más que O (log (n))
  • bool TryFindFoo(out Foo) puede devolver nulo y su complejidad es más que O (log (n))

De esa manera, el código es bastante claro sobre la intención y la complejidad que puede esperar.

Normalmente, los Getters son para acceso directo a la lista o al diccionario / conjunto.
Los buscadores son búsquedas profundas, análisis completo de la lista, etc ...

En tu 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;
    }
}
    
respondido por el Cyril Gandon 29.01.2013 - 16:00
2

get es apropiado en cualquier caso _ de hecho, a menudo se asume que para obtener algo, primero hay que encontrarlo. Entonces, si no estás seguro, usa get .

Yo usaría find para métodos como findMinimum() o findOptimal() , es decir, donde hay algún algoritmo especial que calcula el valor de retorno, y no simplemente hace una solicitud al DB, sistema de archivos, servidor remoto , etc. para recibir algunos datos.

    
respondido por el superM 09.01.2013 - 22:43
2

No use buscar u obtener prefijos. Esta es una violación de UniformAccessPrinciple acuñado por bertrand meyer. ¿Por qué no crear un método como el siguiente:

public String revision(Item item)
    
respondido por el giorgi dvalishvili 29.10.2017 - 12:44
1

Generalmente usaré Get para recuperar un objeto / valor, y Find para recuperar su ubicación (en una matriz, por ejemplo).

por ejemplo:

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

integer i = somearray.Find( 'name');
    
respondido por el GrandmasterB 29.01.2013 - 18:30
0

Para mí, find implica que posiblemente puede haber más de un resultado presente. get implica solo uno.

    
respondido por el Karl Bielefeldt 09.01.2013 - 22:40

Lea otras preguntas en las etiquetas