Подтвердить что ты не робот

Какое хорошее имя для метода, который получает или создает объект?

Скажите, что у вас есть кэш, и метод, который сделает что-то вроде следующего:

if (wanted Foo is not in cache)
    cache.Add(new Foo())
Return Foo from cache

Как бы вы назвали этот метод? GetFoo(), GetOrCreateFoo() или что-то еще (и лучше)? Или это действительно должно быть разделено на два метода?

4b9b3361

Ответ 1

В большинстве случаев достаточно простого GetFoo, поскольку вызывающему абоненту не нужно знать, что вы его создаете и кэшируете. Это инкапсуляция.

Однако в некоторых случаях создание является дорогостоящей операцией, поэтому полезно знать, что вы можете создавать что-то по требованию, а в некоторых случаях оно будет медленным. В этом случае другое соглашение об именах делает его более понятным для вызывающего. В этом случае GetOrCreate() или Get (Options.CreateIfMissing) является хорошим подсказкой для вызывающего.

(Поведение, конечно, должно быть отмечено в документации, но полезно использовать имя метода, которое напоминает людям о побочных эффектах, когда они читают код, без необходимости придумывать и читать документацию для каждого метода, который называется)

Такой случай, когда я нахожу это чаще всего (например) при поиске дерева node (например, в документе Xml), может иметь "CreateNode" (для создания node без добавления его в дерево) и "AddNode" (добавить существующий node к дереву). В этом случае "Добавить a node, если он еще не существует" должен иметь другое описательное имя, поэтому я буду использовать что-то вроде "EnsureNodeExists", чтобы отличить его и сделать цель понятной.

Ответ 2

Я знаю, что я очень опаздываю на вопрос, но могу ли я предложить GrabFoo() как соглашение для get-or-create-if-missing, чтобы отличить его от GetFoo()?

Глядя на синонимы Get, я вижу несколько подходящих глаголов, некоторые из которых обычно используются как глаголы метода. Например, Fetch уже означает получение чего-то из внешней системы. (например, база данных или сеть)

Захват кажется редко используемым и может содержать (хотя и слабую) семантику I want you to get-or-create it, no matter what.

Ответ 3

Как насчет Getsert? от get или insert, так как update или insert есть Upsert

Хотя я не видел, чтобы какие-либо популярные фреймворки использовали этот термин, но это соответствует идее, что @Jason Williams указал, что:

  • пользователю должно быть ясно, что он не просто сделает нормальный доступ
  • Вам не нужно обращаться к документации, чтобы узнать, что она делает.
  • Легко настраивается и интуитивно понятен? (Я не уверен)

Ответ 4

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

Ответ 5

Я бы назвал его GetFoo, исходя из того, что вызывающему не заботится о том, будет ли он предоставлен новый или уже созданный Foo - он просто хочет Get a Foo.

Ответ 6

Для кеша я бы просто назвал его GetFoo(). Кэш предназначен для того, чтобы действовать как фасад за источником данных, чтобы вызывающие пользователи могли легко обращаться к элементам, не беспокоясь о том, как они загружаются или не загружаются.

Я бы назвал его GetFoo, но документировал, что если запрошенный объект не находится в кеше, то кеш загрузит его (и все потенциальные последствия, которые могут иметь последствия).

Ответ 7

Другой вариант, который имеет смысл, если вы являетесь ссылочным прозрачным или объект является одиночным.

Иногда вызов getOrCreate() - это действительно ленивая инициализация. Таким образом, вы хотите создать один объект, и если он уже был создан, верните ссылку на него. В этом случае я бы назвал метод lazyGet, который также используется в других библиотеках, таких как javaslang lazy.

MyObject lazyGet() {
}

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

P.S.: Это также используется для memoization, который является методом оптимизации, в котором вы возвращаете кешированные объекты неизменных структур данных.

Ответ 8

Слова obtain и acquire кажутся подходящими. Особенно obtain:

чтобы войти во владение; получать, приобретать или приобретать, усилия или по просьбе: получить разрешение; для получения лучшего доход.

Можно сказать, что в вашем случае вызывающий метод получает foo.

Ответ 9

Я бы выбрал только GetFoo(), как и большинство людей, упомянутых здесь.

Причина - метод отвечает за возврат экземпляра объекта. Это его главная ответственность. Если объект не создан, создайте объект, помещенный в кеш, и затем верните его. внешние вызывающие, не нужно беспокоиться о том, какой метод внутренне делает для возврата объекта, вызывающие вызовы будут просто вызывать GetFoo(), когда это необходимо. Метод GetFoo() инкапсулирует и скрывает сложность создания и кеширования объекта. следовательно, GetFoo()

Ответ 10

Я знаю, что у этой темы есть 6 лет. Но... Я думаю, что лучшее имя

getInstanceFoo()

или

getFooInstance()

как в одиночном классе.

Ответ 11

Я использую Take вместо Get. Причины, по которым:

  • Take также немного напоминает make
  • to Take имеет то же значение, что и Get в данном контексте
  • Take звучит более сильным, чем Get, поэтому, если я не могу Get, я просто Take его

Ответ 12

Beget

Пара определений, которые подходят:

  • Вызывать существование или возникать; производить
  • Чтобы вызвать или создать

Слово также разбивается на две идеи в вашем вопросе.

"Какое хорошее название для метода, который получает или создает объект? "

Be = создает

Get = получает

Плюс это действительно коротко.


Другой альтернативой является Resolve.

Я позаимствовал это слово у Autofac, который использует методы Resolve, чтобы получить экземпляр объекта или создать его при необходимости.

Ответ 13

Я бы назвал его "getFoo()" и добавил к вашим комментариям, что делает функция, если Foo не существует.

Ответ 14

Это зависит от того, какой объект имеет смысл для пользователя.

Если создание не важно для пользователя, это GetFoo; в противном случае вызовите его createOrGetFoo.

Если требуется дифференциация понятий, у вас могут быть такие методы, как GetFoo, CreateFoo и createOrGetFoo.

Я предпочитаю называть его GetFoo согласно вашей информации.

Ответ 15

Предполагая, что этот метод находится в cacheManager, тогда fetch (требуется) [или получить (требуется) в зависимости от вашего личного pref] достаточно - с документом API, указывающим, что элемент создан, если он не существует.

Требуется набирать соответствующую информацию - так что Foo в имени метода не требуется.

Ответ 16

6 лет опоздали на вечеринку, но я предлагаю сокращение от "define": det, как в detFoo().

  • Он короткий
  • Мгновенно связано с get/set
  • Неоднозначность в отношении того, делает ли он изменения или нет (поскольку базовый метод неоднозначен в отношении изменений, он должен иметь соглашение об именах, чтобы отразить это)

Ответ 17

Подобно upsert (обновить и вставить), getsert, как в get или insert и return.

Или проявите творческий подход:

  • greate как в get или create

  • gadd как в get или add

Ответ 18

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

Другой подход, который ясно передает его цель, будет

GetFoo(bool createIfNotExists)

Конечно, если мы действительно говорим о кеше, стороне реализации может быть безразлично, был ли элемент только что создан. Вышеупомянутое применяется в тех случаях, когда вызывающий объект действительно должен знать о возможном создании Foo и его последствиях (например, при извлечении из файловой системы или db, возможно?)