Имена методов для получения данных [закрыто]

104

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

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

Большинство имен методов несколько просты и очевидны ... SaveEmployee (), DeleteOrder (), UploadDocument (). Конечно, с классами вы, скорее всего, будете использовать короткую форму ... Save (), Delete (), Upload () соответственно.

Однако я всегда боролся с первоначальным действием ... как получить данные. Кажется, что для каждого проекта я в конечном итоге прыгаю между разными соглашениями об именах, потому что мне никогда не нравится последнее, что я использовал. Насколько я могу судить, это возможности ->

  • GetBooks ()
  • FetchBooks ()
  • Получить книги ()
  • FindBooks ()
  • LoadBooks ()

Что ты думаешь?

Джейсон
источник

Ответы:

127

Все дело в последовательной семантике ;

В заголовке вопроса вы используете получение данных . Это чрезвычайно общий смысл в том смысле, что вам нужно определить, что означает получение семантически значимым однозначным образом. Я предлагаю следующие примеры, чтобы, надеюсь, направить вас на правильный путь, когда вы думаете об именовании вещей.

  1. getBooks() Когда вы получаете все книги, связанные с объектом, это означает, что критерии для набора уже определены, и откуда они берутся - это скрытая деталь.
  2. findBooks(criteria) когда вы пытаетесь найти подмножество книг на основе параметров вызова метода, это обычно будет перегружено различными критериями поиска
  3. loadBooks(source) это когда вы загружаете из внешнего источника, такого как файл или db.
  4. Я бы не стал использовать fetch / retrieve, потому что они слишком расплывчаты и отождествляются с get, а с терминами не связана однозначная семантика.

Пример: выборка подразумевает, что некоторая сущность должна пойти, получить что-то удаленное и вернуть это. Собаки приносят палку, а получение - это синоним слова « выборка» с добавленной семантикой, что вы, возможно, уже владели этим предметом раньше. get также является синонимом слова " получить", что означает, что вы единолично владеете чем-то, и никто другой не может получить это одновременно.

Семантика чрезвычайно важна:

раздел лингвистики и логики, связанный со значением

Комментарии являются доказательством того, что общие термины, такие как get и fetch , не имеют определенной семантики и по-разному интерпретируются разными людьми. Выберите семантику для термина, задокументируйте, что он должен подразумевать, если семантика не ясна, и согласитесь с ее использованием.

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

Сообщество
источник
5
Я бы добавил, что использовал бы выборку / извлечение, если бы данные нужно было извлекать из базы данных,
Лиз Альбин,
1
Хммм. Не могли бы вы провести различие между критериями подстановки и конкретными критериями. Например, вы бы использовали FindBooks (издатель) при поиске книг от определенного издателя? Или, может быть, GetBooksFromPublisher (издатель)?
Джейсон
6
publisher.getBooks () был бы предпочтительным способом сделать это, когда издатель был конкретным экземпляром издателя. Library.getBooks (издатель), где издатель реализовал интерфейс BookSearchCriteria. То же самое с Library.getBooks (автор), где автор реализовал интерфейс BookSearchCriteria.
3
Спасибо за этот ответ. Определенно добавляет ясности. По сути, вы говорите, что методы поиска с помощью определенного фильтра должны оставаться с объектом. Каким образом будет использоваться интерфейс? Например, интерфейс BookSearchCriteria. Можете ли вы предоставить образец кода?
Джейсон
2
как правило именование, как , fetchкогда данные время доступа является низким , то есть на одном устройстве, из локальной базы данных, из памяти. load, или, downloadесли время доступа больше , из Интернета, внешней БД, из файла
János
13

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

  • GetBooks ()

Этот метод принадлежит источнику данных, и нам все равно, как он их получает, мы просто хотим получить их из источника данных.

  • FetchBooks ()

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

  • FindBooks ()

Ваш источник данных - библиотекарь и будет использовать десятичную систему Дьюи для поиска ваших книг.

  • LoadBooks ()

Эти книги находятся в каком-то «электронном книжном мешке» и должны быть загружены в него. Обязательно вызовите ZipClosed () после загрузки, чтобы не потерять их.

  • Получить книги ()

У меня ничего нет.

Ник Ларсен
источник
2
В принятом ответе нет четкой разницы между «get» и «fetch», как и в этом ответе. Fetch подразумевает, что это должен сделать кто-то другой, потому что это займет некоторое время или потребует некоторого опыта для выполнения, тогда как get подразумевает, что это мгновенно и доступно дословно или «с полки».
Sridhar Sarnobat
У меня сегодня тоже проблемы с принятым ответом. Для моего проекта (на основе React / Redux) я считаю важным различать данные, извлекаемые из хранилища Redux, и базу данных приложения, а также сторонний API. Правильное решение этой проблемы определенно поможет улучшить читаемость в будущем. Исходный разработчик использовал и addдля записи в базу данных, и для записи в Store. Теперь я пытаюсь отделить их друг от друга, и это больно.
tim.rohrer
9

Ответ - просто придерживайтесь того, что вам удобно, и будьте последовательны.

Если у вас есть веб-сайт barnes and nobles и вы используете GetBooks (), то, если у вас есть другой элемент, например объект Movie, используйте GetMovies (). Так что все, что нравится вам и вашей команде, и будьте последовательны.

JonH
источник
22
По крайней мере, вы последовательны в правильном написании. ;-)
Вим Холлебрандс
1
Очень консистентный ... :)
JonH
Совсем не обиделась ... спасибо, что указали на это.
Джейсон
2

В OO (C ++ / Java) я обычно использую getSomething и setSomething, потому что очень часто, если не всегда, я либо получаю частный атрибут из класса, представляющего этот объект данных, либо устанавливаю его - пару геттер / сеттер. В качестве плюса Eclipse генерирует их для вас.

Я обычно использую Load только когда имею в виду файлы - например, «загрузка в память», что обычно подразумевает загрузку в примитивы, структуры (C) или объекты. Я использую отправку / получение для Интернета.

Как было сказано выше, согласованность - это все, включая кросс-разработчиков.

Энтони Пеграм
источник
1

Непонятно, что вы имеете в виду под «получением данных». Из базы данных? Файл? Объем памяти?

Я считаю, что именование методов состоит в том, чтобы устранить любые двусмысленности и, в идеале, необходимость поиска документации. Я считаю, что это нужно делать даже за счет более длинных имен методов. Согласно исследованиям, большинство разработчиков среднего уровня + могут читать несколько слов в верблюжьем регистре. С помощью IDE и автозавершения написание длинных имен методов также не проблема.

Таким образом, когда я вижу «fetchBooks», если контекст не очень ясен (например, класс с именем BookFetcherFromDatabase), он неоднозначен. Взять откуда? В чем разница между fetch и find? Вы также рискуете столкнуться с проблемой того, что некоторые разработчики будут связывать семантику с определенными ключевыми словами. Например, выборка для базы данных (или памяти) по сравнению с загрузкой (из файла) или загрузкой (из Интернета).

Я бы предпочел увидеть что-то вроде «fetchBooksFromDatabase», «loadBookFromFile», «findBooksInCollection» и т.д. Каждый, читающий это, сразу поймет, что вы пытаетесь сделать.

Ури
источник
4
Проблема с fetchBooksFromDatabase заключается в том, что вы хотите факторизовать / обобщать и fetchBooks, тогда может быть некоторое извлечение данных из, скажем, XML. Мне тоже нравится конкретика, но тогда вы обнаружите, что разделяете одни и те же функции на разные имена функций . И это сэр не круто!
JonH
Я думаю, что разница между Get и Find, как правило, очевидна, но меня интересует вопрос о Get и Fetch. Черт .. есть разница?
Джейсон
@JonH: Я с тобой согласен. Однако, если бы вы знали заранее, что у вас будут разные типы выборки, вы бы закодировали это в названии класса (чтобы вы могли интерпретировать значение из контекста, например, DatabaseConnector vs. XmlConnector).
Uri
7
@Jason: Поскольку "геттеры" настолько распространены (и являются частью таких фреймворков, как JavaBeans), многие программисты склонны думать о них как о почти прозрачных средствах доступа к полю данных. «Выборка», с другой стороны, указывает некоторым программистам на более длительный доступ, который включает в себя передачу данных с места на место (выборка из ЦП) или выборка из базы данных. Например, в языке запросов Hibernate есть конструкция Fetch. Разработчики часто используют методы, основанные на их ожиданиях от имени, а не на чтении документации, поэтому крайне важно избегать отправки неправильного сигнала.
Uri