Come e perché decidere tra i metodi di denominazione con i prefissi "ottieni" e "trova"

40

Ho sempre difficoltà a capire se dovrei nominare un certo metodo che inizia con getSomething contro findSomething .

Il problema risiede nella creazione di helper per API mal progettate. Questo di solito si verifica quando si ricevono dati da un oggetto, che richiede l'oggetto come parametro. Ecco un semplice esempio:

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

Come e perché decidere tra nominare questo metodo come getRevision() o findRevision() ?

    
posta knownasilya 09.01.2013 - 22:36
fonte

9 risposte

74

Uso Get quando so che il tempo di recupero sarà molto breve (come in una ricerca da una tabella hash o btree).

Find implica un processo di ricerca o un algoritmo computazionale che richiede un periodo di tempo "più lungo" per eseguire (per un valore arbitrario di più lungo).

    
risposta data 09.01.2013 - 22:50
fonte
53

Direi che find potrebbe fallire ma get non dovrebbe.

    
risposta data 09.01.2013 - 22:51
fonte
35

Per citare una conversazione che ho spesso con i miei figli:

me: Hey kid! Go find me some batteries

kid: But where are they?

me: That's why I told you to go find them. If I knew where they were, I would have told you to go get them. Or you could ask your mother.

La stessa idea vale:

  • usa "get" per un metodo che restituisce un'informazione disponibile a basso costo (e può essere probabilmente ottimizzata o altrimenti ottimizzata) o per un'informazione posseduta unicamente da questo oggetto.

  • usa "trova" per un metodo che funziona per ottenere un'informazione, o usa altri oggetti per trovarlo.

risposta data 22.01.2013 - 16:19
fonte
3

Trova implica non avere il risultato, come quando si esegue una query di database con alcuni parametri che possono cambiare tra le chiamate. Get, d'altra parte, implica che i risultati siano noti al metodo in anticipo o non cambieranno una volta noti, che non ci sono parametri per la chiamata.
Quindi, userei ad esempio Customer findCustomerById (long customerId) e Customer getCustomer ()

    
risposta data 10.01.2013 - 10:00
fonte
3

Applico il seguente schema:

  • Foo GetFoo() non può restituire null e la sua complessità è O (log (n)) o meno
  • bool TryGetFoo(out Foo) può restituire null e la sua complessità è O (log (n)) o meno
  • Foo FindFoo() non può restituire null e la sua complessità è maggiore di O (log (n))
  • bool TryFindFoo(out Foo) può restituire null e la sua complessità è maggiore di O (log (n))

In questo modo il codice è abbastanza chiaro sull'intento e sulla complessità che ci si può aspettare.

Tipicamente, i Getter sono per l'elenco diretto o per l'accesso al dizionario / set.
I Finder sono ricerca profonda, scansione completa dell'elenco, ecc ...

Nel tuo 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;
    }
}
    
risposta data 29.01.2013 - 16:00
fonte
2

get è appropriato in ogni caso _ infatti spesso si presume che per ottenere qualcosa devi prima trovarlo. Quindi, se non sei sicuro, utilizza get .

Vorrei usare find per metodi come findMinimum() o findOptimal() , cioè dove c'è un algoritmo speciale che calcola il valore di ritorno, e non fa semplicemente una richiesta al DB, al file system, al server remoto , ecc. per ricevere alcuni dati.

    
risposta data 09.01.2013 - 22:43
fonte
2

Non utilizzare trova o ottieni prefissi. Questa è una violazione di UniformAccessPrinciple coniato da bertrand meyer. Perché non creare un metodo come il seguente:

public String revision(Item item)
    
risposta data 29.10.2017 - 12:44
fonte
1

Generalmente userò Get per recuperare un oggetto / valore e Find per recuperare la sua posizione (in una matrice, per esempio).

per esempio:

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

integer i = somearray.Find( 'name');
    
risposta data 29.01.2013 - 18:30
fonte
0

Per me, find implica che ci può essere più di un risultato presente. get implica solo uno.

    
risposta data 09.01.2013 - 22:40
fonte

Leggi altre domande sui tag