J'ai toujours du mal à déterminer si je devrais nommer une certaine méthode commençant par getSomething
contre findSomething
.
Le problème réside dans la création helpers pour les API mal conçues. Cela se produit généralement lors de l'obtention de données à partir d'un objet, ce qui nécessite 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 comme getRevision()
ou findRevision()
?
J'utilise Get
quand je sais que le temps de récupération sera très court (comme dans une recherche depuis une table de hachage ou btree).
Find
implique un processus de recherche ou un algorithme de calcul qui nécessite une période de temps "plus longue" pour s'exécuter (pour une valeur arbitraire de plus longue).
Je dirais que find
peut échouer mais get
ne devrait pas.
Pour citer une conversation que j'ai souvent avec mes enfants:
moi: Hé gamin! Allez me trouver des piles
kid: Mais où sont-ils?
moi: C'est pourquoi je vous ai dit d'aller les trouver . Si j'avais su où ils étaient, je vous aurais dit d'aller les chercher . Ou vous pourriez demander à votre mère.
La même idée vaut:
utilisez "get" pour une méthode qui renvoie une information disponible à moindre coût (et peut probablement être intégrée ou autrement optimisée), ou pour une information appartenant uniquement à cet objet.
utilisez "find" pour une méthode qui fonctionne pour obtenir une information, ou utilise d'autres objets pour la trouver.
J'applique le modèle 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 retourner null et sa complexité est supérieure à O (log (n))De cette façon, le code est assez clair sur l'intention et sur la complexité que vous pouvez attendre.
En règle générale, les Getters sont destinés à un accès direct à une liste ou à un dictionnaire/ensemble.
Les Finders sont la recherche approfondie, l'analyse complète de la liste, etc ...
Dans ton cas:
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;
}
}
La recherche 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 qui peuvent 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 à l'appel.
Donc, j'utiliserais par exemple Customer findCustomerById (long customerId) et Customer getCustomer ()
get
est approprié dans tous les cas _ en fait, on suppose souvent que pour obtenir quelque chose, vous devez d'abord le trouver. Donc, si vous n'êtes pas sûr, utilisez get
.
J'utiliserais find
pour des méthodes comme findMinimum()
ou findOptimal()
, c'est-à-dire où il existe un algorithme spécial qui calcule la valeur de retour et ne fait pas simplement une demande à la base de données, le système de fichiers, le serveur distant, etc. pour recevoir des données.
N'utilisez pas les préfixes find ou get. Il s'agit d'une violation de niformAccessPrinciple inventé par bertrand meyer. Pourquoi ne pas créer une méthode comme celle-ci:
public String revision(Item item)
J'utiliserai généralement Get
pour récupérer un objet/valeur, et Find
pour récupérer son location (dans un tableau, par exemple).
par exemple:
object o = obj.GetItem( 'name');
integer i = somearray.Find( 'name');
Pour moi, find
implique qu'il peut y avoir plus d'un résultat présent. get
n'en implique qu'un.