Назви методів отримання даних [закрито]


103

Попередження: Це не дуже серйозне питання / дискусія, яку я публікую ... але я готовий зробити ставку на те, що більшість розробників розмірковували над цим "питанням" ...

Завжди хотів отримати інші думки щодо іменування конвенцій для методів, які діставались, отримували дані звідкись і повертали їх ...

Більшість назв методів є дещо простими і очевидними ... SaveE Employee (), DeleteOrder (), UploadDocument (). Звичайно, з класами ви, швидше за все, використовуєте коротку форму ... Зберегти (), Видалити (), Завантажити () відповідно.

Однак я завжди боровся з початковими діями ... як отримати дані. Здається, що для кожного проекту я переживаю між різними умовами іменування, тому що я ніколи не задоволений останнім, який використовував. Наскільки я можу сказати, ці можливості ->

  • GetBooks ()
  • FetchBooks ()
  • Отримати книги ()
  • FindBooks ()
  • LoadBooks ()

Яка ваша думка?

Відповіді:


126

Мова йде про послідовну семантику ;

У назві запитання ви використовуєте отримання даних . Це дуже загальне в тому сенсі , що вам потрібно визначити , що отримання коштів семантичний значно однозначний шлях. Я пропоную наступні приклади, щоб, сподіваючись, поставити вас на правильний шлях, коли думаєте про називання речей.

  1. getBooks() коли ви отримуєте всі книги, пов’язані з об'єктом, це означає, що критерії для набору вже визначені, і звідки вони надходять - це прихована деталь.
  2. findBooks(criteria) Коли ви намагаєтеся знайти підмножину книг на основі параметрів для виклику методу, зазвичай це буде перевантажено різними критеріями пошуку
  3. loadBooks(source) це коли ви завантажуєтесь із зовнішнього джерела, наприклад файлу чи db.
  4. Я б не використовував "fetch / retrieve", оскільки вони занадто розпливчасті і плутаються з get і немає однозначної семантики, пов'язаної з термінами.

Приклад: " Вибір" означає, що якомусь об'єкту потрібно піти і отримати щось віддалене і повернути його назад. Собаки витягують палицю, і витягування є синонімом для вибору з додаванням семантики, якою ви, можливо, володіли цією річчю і раніше. get - синонім отримання , а також означає, що ви маєте єдине володіння чимось, і ніхто більше не може його придбати одночасно.

Семантика надзвичайно важлива:

галузь мовознавства та логіки, що стосується значення

Зауваження є доказом того, що загальні терміни, такі як get and fetch , не мають специфічної семантики і різні люди трактуються по-різному. Виберіть смисловий термін, задокументуйте те, що він має на увазі, якщо семантичний не чіткий і відповідає його використанню.

слова з розпливчастими або неоднозначними значеннями різні люди дають різну семантику через їхні упередження та передумови, засновані на їх особистій думці, і це ніколи не закінчиться добре.


4
Додам, що я б скористався функцією "отримання" / отримання, якщо дані будуть отримані з бази даних
Ліз Альбін,

1
Хммм. Ви б розрізнили критериї підстановки та конкретні критерії. Наприклад, чи використовуєте Ви FindBooks (видавець), шукаючи книги певного видавця? А може бути, GetBooksFromPublisher (publisher)?
Джейсон

5
publisher.getBooks () був би кращим способом цього, коли видавець був певним екземпляром Publisher. Library.getBooks (видавець), де видавець реалізував інтерфейс BookSearchCriteria. Те саме з Library.getBooks (автор), де автор реалізував інтерфейс BookSearchCriteria. Ви також логічно матимете Factory.getPublishers () як фабричний метод

3
Дякую за цю відповідь. Однозначно додає ясності. По суті, ви говорите, що методи пошуку певним фільтром повинні залишатися об'єктом. Яким способом буде використовуватися інтерфейс? Наприклад, інтерфейс BookSearchCriteria. Чи можете ви надати зразок коду?
Джейсон

2
як правило іменування, як , fetchколи дані час доступу є низьким , тобто на одному пристрої, з локальної бази даних, з пам'яті. loadабо downloadякщо час доступу більший , з Інтернету, зовнішнього БД, з файлу
János,

13

Чесно кажучи, ви просто повинні визначитися зі своєю командою, яку назву буде використовувати. Але для розваги давайте подивимось, яким би був твій порядок думок, щоб вирішити будь-яке з них:

  • GetBooks ()

Цей метод належить до джерела даних, і нам не байдуже, як він їх отримує, ми просто хочемо отримати їх з джерела даних.

  • FetchBooks ()

Ви ставитесь до свого джерела даних як до кровоточиці, і його робота - забирати ваші книги. Я думаю, ви самі повинні вирішити, скільки він може вмістити в рот одразу.

  • FindBooks ()

Ваше джерело даних є бібліотекарем, і він буде використовувати систему Дьюї Десятковий для пошуку ваших книг.

  • LoadBooks ()

Ці книги належать до якоїсь "електронної книжкової сумки" і повинні бути завантажені в неї. Не забудьте зателефонувати ZipClosed () після завантаження, щоб запобігти їх втраті.

  • Отримати книги ()

Я не маю нічого.


1
Прийнята відповідь не добре розрізняла "отримати" і "отримати", а також цю відповідь. Вибір означає, що це повинен зробити хтось інший, тому що це займе певний час або вимагає певного досвіду для виконання, тоді як отримання означає, що це миттєво і доступно дослівно або "з полиці".
Шрідхар Сарнобат

У мене теж сьогодні проблеми з прийнятою відповіддю. Для мого проекту (на основі React / Redux) я вважаю, що важливо розрізняти дані, що витягуються з магазину Redux, від бази даних програми та API сторонніх розробників. Отримати це право, безумовно, допоможе в читанні в майбутньому. Оригінальний розробник використовував addяк запис у базу даних, так і запис у Магазин. Зараз я намагаюся відокремити це, і це біль.
tim.rohrer

9

Відповідь - просто дотримуйтесь того, що вам подобається, і будьте стійкі.

Якщо у вас є веб-сайт Barnes and благородників, і ви використовуєте GetBooks (), то якщо у вас є інший предмет, наприклад, суб'єкт фільму, використовуйте GetMovies (). Тож все, що вам і вашій команді подобається, і будьте стійкі.


22
Принаймні, ви послідовно вказуєте на неправильне написання. ;-)
Вім Холлебрандсе

1
Дуже добре з консистентом ... :)
JonH

Не ображаюся зовсім ... дякую, що вказав на це.
Джейсон

2

В OO (C ++ / Java) я схильний використовувати getSomething і setSomething, тому що дуже часто, якщо не завжди, я отримую приватний атрибут з класу, що представляє цей об'єкт даних, або встановлюю його - пару getter / setter. Як плюс, Eclipse генерує їх для вас.

Я, як правило, використовую Load лише тоді, коли я маю на увазі файли - як у "завантаженні в пам'ять", і це, як правило, передбачає завантаження в примітиви, структури (C) або об'єкти. Я використовую надсилання / отримання для Інтернету.

Як було сказано вище, послідовність - це все, що включає і крос-розробники.


1

Не ясно, що ви маєте на увазі під "отриманням даних". З бази даних? Файл? Пам'ять?

Моє бачення методу іменування полягає в тому, що його роль полягає у усуненні будь-яких неясностей, а в ідеалі - необхідності шукати документацію. Я вважаю, що це слід робити навіть ціною довших назв методів. Згідно з дослідженнями, більшість проміжних + розробників вміють читати кілька слів у випадку з верблюдами. За допомогою IDE та автоматичних доповнень написання довгих імен методів також не є проблемою.

Таким чином, коли я бачу "fetchBooks", якщо тільки контекст не дуже чіткий (наприклад, клас під назвою BookFetcherFromDatabase), це неоднозначно. Дістати його звідки? Яка різниця між вилученням і знахідкою? Ви також ризикуєте проблемою, що деякі розробники пов'язуватимуть семантику з певними ключовими словами. Наприклад, отримати базу даних (або пам'ять) проти завантаження (з файлу) або завантажити (з Інтернету).

Я б швидше бачив щось на кшталт "fetchBooksFromDatabase", "loadBookFromFile", "findBooksInCollection" і т. Д. Це менш видно, але як тільки ви перейдете довжину, це зрозуміло. Кожен, хто прочитає це, одразу отримає те, що ви намагаєтеся зробити.


4
Проблема з fetchBooksFromDatabase полягає в тому, коли ви хочете скористатись факторами / узагальнити та fetchBooks, то може виникнути деяке витягування даних із скажімо XML. Мені також подобаються конкретні відомості, але ви виявляєте, що ви розділяєте однакові функції у різних імен функцій . І що сер не крутий!
JonH

Я думаю, що різниця між "Get to vers" "- це очевидно, але мені цікаво питання щодо" Get vs Fetch ". Чорт ... чи є різниця?
Джейсон

@JonH: Я з цим згоден. Однак, якби ви заздалегідь знали, що у вас буде різні типи вибору, ви б закодували це в імені класу (щоб ви могли інтерпретувати значення з контексту, наприклад, DatabaseConnector vs. XmlConnector).
Урі

7
@Jason: Оскільки «гетери» настільки всюдисущі (і є частиною рамок, як JavaBeans), багато програмістів, як правило, вважають їх майже прозорими засобами доступу до поля даних. "Вилучення", з іншого боку, вказує деяким програмістам більш тривалий доступ, який передбачає перенесення даних з місця на місце (вилучення процесора a-la) або вилучення бази даних. Наприклад, мова запитів Hibernate має конструкцію Fetch. Розробники часто використовують методи, що базуються на очікуванні назви, а не на читанні документації, тому уникнення надсилання неправильного сигналу має вирішальне значення.
Урі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.