Siempre tengo problemas para determinar si debo nombrar un cierto método comenzando con getSomething
versus findSomething
.
El problema reside en crear ayudantes para API mal diseñadas. Esto generalmente ocurre cuando se obtienen datos de un objeto, que requiere el objeto como 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()
?
Respuestas:
Lo uso
Get
cuando sé que el tiempo de recuperación será muy corto (como en una búsqueda de 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 ejecutarse (por algún valor arbitrario de más tiempo).fuente
find
con un algoritmo de tabla hash?get
yfind
se aplicarían según cómo se use.Yo diría que
find
puede fallar peroget
no debería.fuente
find
puede devolver NULL mientrasget
que nunca devolverá NULL pero podría arrojar (o afirmar), estoy de acuerdo.find()
devolucionesOptional<>
? En ese casofind
también esnull
seguro.Para citar una conversación que a menudo tengo con mis hijos:
La misma idea es válida:
use "get" para un método que devuelva una información disponible a bajo precio (y que probablemente pueda ser incorporada o de otra forma optimizada), o para una información de propiedad exclusiva de este objeto.
use "find" para un método que funcione para obtener información, o use otros objetos para encontrarla.
fuente
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 conocidos, que no hay parámetros para la llamada.
Entonces, usaría, por ejemplo, Customer findCustomerById (long customerId) y Customer getCustomer ()
fuente
Aplico el siguiente patrón:
Foo GetFoo()
no puede devolver nulo y su complejidad es O (log (n)) o menosbool TryGetFoo(out Foo)
puede devolver nulo y su complejidad es O (log (n)) o menosFoo 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.
Por lo general, los Getters son para acceso directo a listas o diccionarios / conjuntos.
Los buscadores son búsqueda profunda, escaneo completo de la lista, etc.
En tu caso:
fuente
try
, corto y precisoget
es apropiado en cualquier caso _ de hecho, a menudo se supone que para obtener algo, primero debe encontrarlo. Entonces, si no estás seguro, úsaloget
.Lo usaría
find
para métodos comofindMinimum()
ofindOptimal()
, 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.fuente
find
como prefijo en los ejemplos que proporcionó. Para tareas computacionales, como las de su ejemplo, usaríacalculate
ocompute
.No use buscar u obtener prefijos. Esto es una violación de UniformAccessPrinciple acuñado por bertrand meyer. ¿Por qué no crear un método como el siguiente?
fuente
Generalmente lo usaré
Get
para recuperar un objeto / valor, yFind
para recuperar su ubicación (en una matriz, por ejemplo).por ejemplo:
fuente
Para mí,
find
implica que posiblemente puede haber más de un resultado presente.get
implica solo uno.fuente
getCat
vsfindCat
vsgetCats
vsfindCats
. Elfind..
todavía representa objetos singulares que se devuelven. El plural debe agregarse al sustantivo, en mi opinión.