Nazwy metod pobierania danych [zamknięte]

103

Ostrzeżenie: to jest niezbyt poważne pytanie / dyskusja, którą piszę ... ale jestem gotów się założyć, że większość programistów rozważała ten „problem” ...

Zawsze chciałem uzyskać inne opinie dotyczące konwencji nazewnictwa dla metod, które skądś pobierały dane i zwracały je ...

Większość nazw metod jest dość prosta i oczywista ... SaveEmployee (), DeleteOrder (), UploadDocument (). Oczywiście w przypadku klas najprawdopodobniej użyłbyś krótkiego formularza ... odpowiednio Save (), Delete (), Upload ().

Jednak zawsze zmagałem się z początkowymi działaniami ... jak zdobyć dane. Wygląda na to, że przy każdym projekcie przeskakuję między różnymi konwencjami nazewnictwa, ponieważ nigdy nie jestem do końca zadowolony z ostatniego, z którego korzystałem. O ile wiem, są to możliwości ->

  • GetBooks ()
  • FetchBooks ()
  • Pobierz książki ()
  • FindBooks ()
  • LoadBooks ()

Co myślisz

Jason
źródło

Odpowiedzi:

126

Chodzi o spójną semantykę ;

W tytule pytania używasz pobierania danych . Jest to niezwykle ogólne w tym sensie, że musisz zdefiniować, co oznacza otrzymywanie w znaczący semantycznie jednoznaczny sposób. Podaję następujące przykłady, aby, miejmy nadzieję, skierować cię na właściwą ścieżkę, myśląc o nadawaniu nazw.

  1. getBooks() gdy otrzymujesz wszystkie książki powiązane z obiektem, oznacza to, że kryteria zestawu są już zdefiniowane, a skąd pochodzą, jest ukrytym szczegółem.
  2. findBooks(criteria) gdy próbujesz znaleźć podzbiór książek na podstawie parametrów wywołania metody, zwykle będzie to przeładowane różnymi kryteriami wyszukiwania
  3. loadBooks(source) występuje podczas ładowania z zewnętrznego źródła, takiego jak plik lub baza danych.
  4. Nie użyłbym funkcji pobierania / pobierania, ponieważ są one zbyt niejasne i łączą się z get i nie ma jednoznacznej semantyki związanej z terminami.

Przykład: pobieranie oznacza, że ​​jakaś jednostka musi iść i pobrać coś, co jest zdalne, i przywrócić to. Psy sprowadzić kij, i odzyskać to synonim sprowadzić z dodatkową semantycznej abyście mieli posiadania rzeczy przed, jak również. get jest również synonimem zdobywania, co oznacza, że ​​masz coś w wyłącznym posiadaniu i nikt inny nie może tego nabyć jednocześnie.

Semantyka jest niezwykle ważna:

gałąź językoznawstwa i logiki zajmująca się znaczeniem

Komentarze są dowodem na to, że ogólne terminy, takie jak get i fetch , nie mają określonej semantyki i są różnie interpretowane przez różne osoby. Wybierz semantykę dla terminu, udokumentuj, co ma ona oznaczać, jeśli semantyka nie jest jasna i spójna z jej użyciem.

słowa o niejasnych lub niejednoznacznych znaczeniach otrzymują różną semantykę przez różnych ludzi z powodu ich uprzedzeń i uprzedzeń opartych na ich osobistych opiniach, a to nigdy się dobrze nie skończy.

Społeczność
źródło
4
Dodałbym, że użyłbym pobierania / pobierania, gdyby dane były pobierane z bazy danych
Liz Albin
1
Hmmm. Czy rozróżniłbyś między kryteriami wieloznacznymi a określonymi kryteriami. Na przykład, czy użyłbyś FindBooks (wydawcy) do wyszukiwania książek od określonego wydawcy? A może GetBooksFromPublisher (wydawca)?
Jason
5
Wydawca.getBooks () byłby preferowanym sposobem zrobienia tego, gdy wydawca byłby określoną instancją wydawcy. Library.getBooks (wydawca), w którym wydawca zaimplementował interfejs BookSearchCriteria. To samo z Library.getBooks (autor), gdzie autor zaimplementował interfejs BookSearchCriteria.
3
Dziękuję za tę odpowiedź. Zdecydowanie dodaje trochę przejrzystości. Zasadniczo mówisz, że metody pobierania przez określony filtr powinny pozostać w obiekcie. W jaki sposób będzie używany interfejs? Na przykład interfejs BookSearchCriteria. Czy możesz podać przykładowy kod?
Jason
2
zwykle nazywanie jest podobne do fetchsytuacji, gdy czas dostępu do danych jest krótki , tj. na tym samym urządzeniu, z lokalnej bazy danych, z pamięci. loadlub downloadjeśli czas dostępu jest dłuższy , z Internetu, zewnętrznej bazy danych, z pliku
János
13

Szczerze mówiąc, powinieneś po prostu zdecydować ze swoim zespołem, której konwencji nazewnictwa użyć. Ale dla zabawy zobaczmy, jaki tok myślenia byłby przy podejmowaniu decyzji o którymkolwiek z poniższych:

  • GetBooks ()

Ta metoda należy do źródła danych i nie obchodzi nas, w jaki sposób je uzyskuje, po prostu chcemy je pobrać ze źródła danych.

  • FetchBooks ()

Traktujesz swoje źródło danych jak ogara, a jego zadaniem jest pobieranie Twoich książek. Myślę, że powinieneś sam zdecydować, ile osób może zmieścić się w ustach naraz.

  • FindBooks ()

Twoim źródłem danych jest bibliotekarz i będzie używać systemu dziesiętnego Deweya do wyszukiwania Twoich książek.

  • LoadBooks ()

Te książki należą do jakiejś „elektronicznej torby na książki” i muszą być do niej załadowane. Pamiętaj, aby wywołać ZipClosed () po załadowaniu, aby zapobiec ich utracie.

  • Pobierz książki ()

Nie mam nic.

Nick Larsen
źródło
1
Zaakceptowana odpowiedź nie rozróżnia dobrze między „pobierz” i „pobierz”, a także tą odpowiedzią. Fetch oznacza, że ​​musi to zrobić ktoś inny, ponieważ zajmie to trochę czasu lub będzie wymagało pewnej wiedzy, podczas gdy get oznacza, że ​​jest natychmiastowe i dostępne dosłownie lub „z półki”.
Sridhar Sarnobat
Ja również mam dzisiaj problem z zaakceptowaną odpowiedzią. Uważam, że w przypadku mojego projektu (opartego na React / Redux) ważne jest, aby odróżnić dane pobierane ze sklepu Redux od bazy danych aplikacji od interfejsu API innej firmy. Prawidłowe wykonanie tego z pewnością pomoże w zwiększeniu czytelności w przyszłości. Oryginalny programista używany addzarówno do zapisu w bazie danych, jak i do sklepu. Teraz próbuję je oddzielić i to jest ból.
tim.rohrer
9

Odpowiedź brzmi: trzymaj się tego, z czym czujesz się komfortowo i bądź konsekwentny.

Jeśli masz witrynę barnes and nobles i korzystasz z GetBooks (), to jeśli masz inny element, taki jak obiekt Movie, użyj GetMovies (). Więc cokolwiek Ty i Twój zespół lubicie i bądźcie konsekwentni.

JonH
źródło
22
Przynajmniej jesteś konsekwentny w pisowni spójny. ;-)
Wim Hollebrandse
1
Bardzo spójny z konsekwentnym ... :)
JonH
Wcale nie urażony ... dziękuję za zwrócenie uwagi.
Jason
2

W OO (C ++ / Java) zwykle używam getSomething i setSomething, ponieważ bardzo często, jeśli nie zawsze, albo otrzymuję atrybut prywatny z klasy reprezentującej ten obiekt danych, albo ustawiam go - parę pobierającą / ustawiającą. Dodatkowo Eclipse generuje je dla Ciebie.

Zwykle używam polecenia Load tylko wtedy, gdy mam na myśli pliki - jak w przypadku „ładowania do pamięci”, co zwykle oznacza ładowanie do elementów pierwotnych, struktur (C) lub obiektów. Używam wysyłania / odbierania w Internecie.

Jak wspomniano powyżej, spójność jest wszystkim i obejmuje to między programistami.

Anthony Pegram
źródło
1

Nie jest jasne, co masz na myśli mówiąc o „pobieraniu danych”. Z bazy danych? Plik? Pamięć?

Mój pogląd na temat nazewnictwa metod jest taki, że jego rolą jest wyeliminowanie wszelkich niejasności i idealnie potrzeba przeszukiwania dokumentacji. Uważam, że powinno się to robić nawet kosztem dłuższych nazw metod. Według badań większość programistów + średnio zaawansowanych jest w stanie przeczytać wiele słów w przypadku wielbłąda. Dzięki IDE i autouzupełnianiu pisanie długich nazw metod również nie stanowi problemu.

Tak więc, kiedy widzę „fetchBooks”, chyba że kontekst jest bardzo jasny (np. Klasa o nazwie BookFetcherFromDatabase), jest niejednoznaczny. Zabierz to skąd? Jaka jest różnica między Zarażenie i Zakażenie? Ryzykujesz również problem polegający na tym, że niektórzy programiści będą kojarzyć semantykę z określonymi słowami kluczowymi. Na przykład pobieranie do bazy danych (lub pamięci) a ładowanie (z pliku) lub pobieranie (z sieci).

Wolałbym raczej zobaczyć coś takiego jak „fetchBooksFromDatabase”, „loadBookFromFile”, „findBooksInCollection” itd. Jest to mniej widoczne, ale gdy przekroczysz długość, jest jasne. Każdy, kto to przeczyta, od razu zrozumie, co próbujesz zrobić.

Uri
źródło
4
Problem z fetchBooksFromDatabase polega na tym, że chcesz wziąć pod uwagę / uogólnić i pobrać książki, a następnie pobrać dane z, powiedzmy, XML. Lubię też szczegóły, ale wtedy zdarza się, że rozdzielasz tę samą funkcjonalność pod różnymi nazwami funkcji . A ten pan nie jest fajny!
JonH
Myślę, że różnica między Get i Find jest oczywista, ale zastanawiam się nad pytaniem dotyczącym Get versus Fetch. Do diabła… czy jest jakaś różnica?
Jason
@JonH: Zgadzam się z tobą w tej sprawie. Jednak gdybyś wiedział z góry, że będziesz mieć różne typy pobierania, zakodowałbyś to w nazewnictwie klas (abyś mógł zinterpretować znaczenie z kontekstu, np. DatabaseConnector vs. XmlConnector).
Uri
7
@Jason: Ponieważ „metody pobierające” są tak wszechobecne (i są częścią frameworków, takich jak JavaBeans), wielu programistów uważa je za prawie przezroczyste środki dostępu do pola danych. Z drugiej strony, „pobieranie” wskazuje niektórym programistom na dłuższy dostęp, który obejmuje przesyłanie danych z miejsca na miejsce (pobieranie a-la CPU) lub pobieranie bazy danych. Na przykład język zapytań Hibernate ma konstrukcję Fetch. Deweloperzy często używają metod opartych na ich oczekiwaniach co do nazwy, a nie czytając dokumentację, więc unikanie wysyłania niewłaściwego sygnału jest kluczowe.
Uri