Nomi dei metodi per l'acquisizione dei dati [chiuso]


103

Attenzione: questa è una domanda / discussione non molto seria che sto postando ... ma sono pronto a scommettere che la maggior parte degli sviluppatori ha riflettuto su questo "problema" ...

Ho sempre voluto ottenere altre opinioni sulle convenzioni di denominazione per metodi che andavano e ricevevano dati da qualche parte e li restituivano ...

La maggior parte dei nomi dei metodi sono alquanto semplici e ovvi ... SaveEmployee (), DeleteOrder (), UploadDocument (). Ovviamente con le classi useresti molto probabilmente la forma abbreviata ... rispettivamente Save (), Delete (), Upload ().

Tuttavia, ho sempre lottato con l'azione iniziale ... come ottenere i dati. Sembra che per ogni progetto finisca per saltare tra diverse convenzioni di denominazione perché non sono mai abbastanza soddisfatto dell'ultima che ho usato. Per quanto ne so, queste sono le possibilità ->

  • GetBooks ()
  • FetchBooks ()
  • Recupera libri ()
  • FindBooks ()
  • LoadBooks ()

Qual è il tuo pensiero?

Risposte:


126

Si tratta di semantica coerente ;

Nel titolo della tua domanda usi il recupero dei dati . Questo è estremamente generale, nel senso che è necessario definire cosa significa ottenere in modo semanticamente significativo e non ambiguo. Offro i seguenti esempi per sperare di metterti sulla strada giusta quando pensi di dare un nome alle cose.

  1. getBooks() è quando ricevi tutti i libri associati a un oggetto, significa che i criteri per il set sono già definiti e la loro provenienza è un dettaglio nascosto.
  2. findBooks(criteria) èquando si sta tentando di trovare un sottoinsieme di libri in base ai parametri della chiamata al metodo, questo di solito sarà sovraccaricato con criteri di ricerca diversi
  3. loadBooks(source) è quando stai caricando da una fonte esterna, come un file o db.
  4. Non userei fetch / retrieve perché sono troppo vaghi e vengono confusi con get e non vi è alcuna semantica univoca associata ai termini.

Esempio: fetch implica che qualche entità deve andare a prendere qualcosa che è remoto e riportarlo indietro. I cani prendono un bastone e recuperare è un sinonimo di recupero con la semantica aggiunta che potresti aver avuto anche il possesso della cosa prima. ottenere è anche un sinonimo di ottenere , il che implica che hai il possesso esclusivo di qualcosa e nessun altro può acquisirlo contemporaneamente.

La semantica è estremamente importante:

il ramo della linguistica e della logica che si occupa del significato

I commenti sono la prova che termini generici come get e fetch non hanno una semantica specifica e sono interpretati in modo diverso da persone diverse. Scegli una semantica per un termine, documenta ciò che si intende implicare se la semantica non è chiara ed essere coerente con il suo utilizzo.

parole con significati vaghi o ambigui ricevono una semantica diversa da persone diverse a causa dei loro pregiudizi e preconcetti basati sulle loro opinioni personali e questo non finirà mai bene.


4
Aggiungerei che userei fetch / retrieve se i dati dovessero essere recuperati da un database
Liz Albin

1
Hmmm. Distingueresti tra criteri con caratteri jolly e criteri specifici. Ad esempio, useresti FindBooks (editore) quando cerchi libri di un editore specifico? O forse GetBooksFromPublisher (editore)?
Jason

5
publisher.getBooks () sarebbe il modo preferito per farlo, in cui publisher era un'istanza specifica di un editore. Library.getBooks (editore) in cui l'editore ha implementato un'interfaccia BookSearchCriteria. Lo stesso con Library.getBooks (autore) in cui l'autore ha implementato un'interfaccia BookSearchCriteria.

3
Grazie per questa risposta. Sicuramente aggiunge un po 'di chiarezza. In sostanza, stai dicendo che i metodi per il recupero da parte di un particolare filtro dovrebbero rimanere con l'oggetto. In che modo verrebbe utilizzata l'interfaccia? Ad esempio, l'interfaccia BookSearchCriteria. Potete fornire un codice di esempio?
Jason

2
di solito la denominazione è come fetchquando il tempo di accesso ai dati è basso , cioè sullo stesso dispositivo, dal database locale, dalla memoria. load, o downloadse il tempo di accesso è più lungo , da Internet, DB esterno, da file
János

13

Onestamente dovresti decidere con il tuo team quale convenzione di denominazione usare. Ma per divertimento, vediamo quale sarebbe la tua linea di pensiero per decidere su uno di questi:

  • GetBooks ()

Questo metodo appartiene a un'origine dati e non ci interessa come ottenerli, vogliamo solo ottenerli dall'origine dati.

  • FetchBooks ()

Tratti la tua fonte di dati come un segugio ed è suo compito recuperare i tuoi libri. Immagino che dovresti decidere da solo quanti può metterne in bocca contemporaneamente.

  • FindBooks ()

La tua fonte dati è un bibliotecario e utilizzerà il sistema decimale Dewey per trovare i tuoi libri.

  • LoadBooks ()

Questi libri appartengono a una sorta di "borsa per libri elettronici" e devono essere caricati al suo interno. Assicurati di chiamare ZipClosed () dopo il caricamento per evitare di perderli.

  • Recupera libri ()

Non ho niente.


1
La risposta accettata non distingueva bene tra "get" e "fetch" così come questa risposta. Fetch implica che deve essere fatto da qualcun altro perché ci vorrà del tempo o richiede una certa esperienza per essere soddisfatto, mentre get implica che è istantaneo e disponibile testualmente o "pronto per l'uso".
Sridhar Sarnobat

Anch'io ho problemi con la risposta accettata oggi. Per il mio progetto (basato su React / Redux) credo sia importante distinguere tra i dati estratti dallo store Redux e il database dell'app rispetto a un'API di terze parti. Ottenere questo corretto aiuterà sicuramente con la leggibilità in futuro. Lo sviluppatore originale utilizzato addper entrambi scrive su un database e scrive nell'archivio. Ora sto cercando di separarli, ed è un dolore.
tim.rohrer

9

La risposta è semplicemente attenersi a ciò con cui ti senti a tuo agio ed essere coerente.

Se hai un sito web di barnes and nobles e usi GetBooks (), se hai un altro elemento come un'entità Movie usa GetMovies (). Quindi qualunque cosa piaccia a te e al tuo team e sii coerente.


22
Almeno sei coerente con errori di ortografia coerenti. ;-)
Wim Hollebrandse

1
Molto coerente con il
composto

Per niente offeso ... grazie per averlo fatto notare.
Jason

2

In OO (C ++ / Java) tendo a usare getSomething e setSomething perché molto spesso, se non sempre, ottengo un attributo privato dalla classe che rappresenta quell'oggetto dati o lo sto impostando: la coppia getter / setter. Inoltre, Eclipse li genera per te.

Tendo ad usare Load solo quando intendo i file - come in "caricamento in memoria" e questo di solito implica il caricamento in primitive, strutture (C) o oggetti. Uso invio / ricezione per il web.

Come detto sopra, la coerenza è tutto e questo include cross-sviluppatori.


1

Non è chiaro cosa intendi per "ottenere i dati". Dal database? Un file? Memoria?

La mia opinione sulla denominazione dei metodi è che il suo ruolo è eliminare qualsiasi ambiguità e, idealmente, la necessità di cercare la documentazione. Credo che ciò dovrebbe essere fatto anche a costo di nomi di metodi più lunghi. Secondo gli studi, la maggior parte degli sviluppatori intermedi + è in grado di leggere più parole nel caso del cammello. Con IDE e completamenti automatici, anche la scrittura di nomi di metodo lunghi non è un problema.

Pertanto, quando vedo "fetchBooks", a meno che il contesto non sia molto chiaro (ad esempio, una classe denominata BookFetcherFromDatabase), è ambiguo. Prenderlo da dove? Qual'è la differenza tra fetch e find? Stai anche rischiando il problema che alcuni sviluppatori associno la semantica a determinate parole chiave. Ad esempio, recupero del database (o memoria) rispetto al caricamento (dal file) o al download (dal web).

Preferirei vedere qualcosa come "fetchBooksFromDatabase", "loadBookFromFile", "findBooksInCollection", ecc. È meno visibile, ma una volta superata la lunghezza, è chiaro. Tutti quelli che leggono questo capiranno subito quello che stai cercando di fare.


4
Il problema con fetchBooksFromDatabase è quando vuoi fattorizzare / generalizzare e fetchBooks, quindi potrebbe essere un po 'di estrazione di dati da XML. Mi piacciono anche le specifiche, ma poi ti ritrovi a separare la stessa funzionalità tra diversi nomi di funzione . E quel signore non è bello!
JonH

Penso che la differenza tra Get e Find tende ad essere ovvia, ma mi chiedo quale sia la domanda relativa a Get rispetto a Fetch. Diavolo ... c'è una differenza?
Jason

@ JonH: sono d'accordo con te su questo. Tuttavia, se sapessi in anticipo che avresti diversi tipi di recupero, li avresti codificati nella denominazione della classe (in modo da poter interpretare il significato dal contesto, ad esempio DatabaseConnector vs. XmlConnector).
Uri

7
@ Jason: Poiché i "getter" sono così onnipresenti (e fanno parte di framework come JavaBeans), molti programmatori tendono a considerarli come mezzi quasi trasparenti per accedere a un campo dati. "Fetch", d'altra parte, indica ad alcuni programmatori un accesso più lungo che coinvolge il trasferimento di dati da un luogo all'altro (a-la CPU fetch) o il database fetch. Ad esempio, il linguaggio di query di Hibernate ha un costrutto Fetch. Gli sviluppatori usano spesso metodi basati sulle loro aspettative sul nome piuttosto che leggendo la documentazione, quindi evitare di inviare il segnale sbagliato è fondamentale.
Uri
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.