Какое хорошее имя для метода, который получает или создает объект?
Скажите, что у вас есть кэш, и метод, который сделает что-то вроде следующего:
if (wanted Foo is not in cache)
cache.Add(new Foo())
Return Foo from cache
Как бы вы назвали этот метод? GetFoo()
, GetOrCreateFoo()
или что-то еще (и лучше)? Или это действительно должно быть разделено на два метода?
Ответы
Ответ 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.
Или проявите творческий подход:
Ответ 18
Если этот дизайн имеет логический смысл в вашем приложении, я думаю, что GetOrCreateFoo
является подходящим именем.
Другой подход, который ясно передает его цель, будет
GetFoo(bool createIfNotExists)
Конечно, если мы действительно говорим о кеше, стороне реализации может быть безразлично, был ли элемент только что создан. Вышеупомянутое применяется в тех случаях, когда вызывающий объект действительно должен знать о возможном создании Foo
и его последствиях (например, при извлечении из файловой системы или db, возможно?)