web-dev-qa-db-fra.com

Comment et pourquoi choisir entre les méthodes de nommage avec les préfixes "get" et "find"

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()?

51
knownasilya

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).

85
Robert Harvey

Je dirais que find peut échouer mais get ne devrait pas.

64
coredump

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.

45
jimwise

J'applique le modèle suivant:

  • Foo GetFoo() ne peut pas retourner null et sa complexité est O(log(n)) ou moins
  • bool TryGetFoo(out Foo) peut retourner null et sa complexité est O(log(n)) ou moins
  • Foo 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;
    }
}
5
Cyril Gandon

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 ()

3
jwenting

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.

2
superM

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)
2
giorgi dvalishvili

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');
1
GrandmasterB

Pour moi, find implique qu'il peut y avoir plus d'un résultat présent. get n'en implique qu'un.

0
Karl Bielefeldt