J'ai toujours du mal à déterminer si je devrais nommer une méthode en commençant par getSomething
versus findSomething
.
Le problème réside dans la création d’ aides pour des API mal conçues. Cela se produit généralement lors de l'obtention de données à partir d'un objet, qui requiert l'objet en tant que paramètre. Voici un exemple 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;
}
Comment et pourquoi choisir entre nommer cette méthode getRevision()
ou findRevision()
?
Réponses:
J'utilise
Get
quand je sais que le temps de récupération sera très court (comme dans une recherche à partir d'une table de hachage ou btree).Find
implique un processus de recherche ou un algorithme de calcul qui nécessite une période d'exécution "plus longue" (pour une valeur arbitraire plus longue).la source
find
remplaciez plus tard par un algorithme de table de hachage?get
etfind
s'appliqueraient en fonction de l'utilisation qui en est faite.Je dirais que cela
find
peut échouer maisget
ne devrait pas.la source
find
NULL peut être retourné alors que NULLget
ne le sera jamais, mais que jette (ou affirme), je suis d’accord.find()
retoursOptional<>
? Dans ce cas,find
c'est aussinull
sans danger.Pour citer une conversation que j'ai souvent avec mes enfants:
La même idée tient:
Utilisez "get" pour une méthode qui renvoie une information disponible à un prix avantageux (et peut probablement être insérée ou optimisée), ou pour une information détenue de manière unique par cet objet.
utilisez "find" pour une méthode qui fonctionne pour obtenir une information ou utilise d'autres objets pour la trouver.
la source
Rechercher implique de ne pas avoir le résultat, comme lors de l'exécution d'une requête de base de données avec certains paramètres susceptibles de changer entre les appels. Get, d'autre part, implique que les résultats sont connus de la méthode à l'avance ou ne changeront pas une fois connus, qu'il n'y a pas de paramètres dans l'appel.
Donc, j'utiliserais par exemple Client findCustomerById (long customerId) et Customer getCustomer ()
la source
J'applique le motif suivant:
Foo GetFoo()
ne peut pas retourner null et sa complexité est O (log (n)) ou moinsbool TryGetFoo(out Foo)
peut retourner null et sa complexité est O (log (n)) ou moinsFoo FindFoo()
ne peut pas retourner null et sa complexité est supérieure à O (log (n))bool TryFindFoo(out Foo)
peut renvoyer null et sa complexité dépasse O (log (n))De cette façon, le code est assez clair sur l'intention et la complexité auxquelles vous pouvez vous attendre.
En règle générale, les accesseurs sont destinés à un accès direct à une liste ou à un dictionnaire / jeu.
Les Finders sont une recherche en profondeur, une analyse complète de la liste, etc ...
Dans ton cas:
la source
try
court et précisget
est approprié dans tous les cas _ en fait, on suppose souvent que pour obtenir quelque chose, il faut d'abord le trouver. Donc, si vous n'êtes pas sûr, utilisezget
.J'utiliserais
find
des méthodes telles quefindMinimum()
oufindOptimal()
, c'est-à-dire qu'il existe un algorithme spécial qui calcule la valeur de retour et ne demande pas simplement à la base de données, au système de fichiers, au serveur distant, etc. de recevoir certaines données.la source
find
de préfixe dans les exemples que vous avez fournis. Pour les tâches de calcul, comme celles de votre exemple, j’utiliseraiscalculate
oucompute
.N'utilisez pas find ou obtenir des préfixes. Ceci est une violation du principe UniformAccess inventé par bertrand meyer. Pourquoi ne pas créer une méthode comme celle-ci:
la source
Je vais généralement utiliser
Get
pour récupérer un objet / valeur, etFind
pour récupérer son emplacement (dans un tableau, par exemple).pour ex:
la source
Pour moi,
find
implique qu'il peut éventuellement y avoir plus d'un résultat présent.get
implique un seul.la source
getCat
vsfindCat
vsgetCats
vsfindCats
. Lafind..
représente encore des objets singuliers retournés. Le pluriel devrait être ajouté au nom, à mon avis.