Имя функции для создания чего-либо, если его еще нет - PullRequest
4 голосов
/ 06 августа 2009

Время от времени я пишу функцию, которая просто создает что-то, если его еще нет, а в противном случае ничего не делает.
Такие имена, как CreateFooIfNecessary() или EnsureThereIsAFoo() работают, но они кажутся немного неуклюжими.

Можно также сказать GetFoo(), но это имя на самом деле не означает, что foo может быть создано первым, и это работает, только если функция возвращает дескриптор / указатель / ссылку на foo.

Могут ли те из вас, кто более знаком с английским языком, придумать лучший способ назвать эти функции?

Ответы [ 13 ]

18 голосов
/ 06 августа 2009

Как насчет GetOrCreate ()

13 голосов
/ 06 августа 2009

UPDATE

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

В результате мой текущий стандарт:

Foo GetFoo(id); // Throws if Foo cannot be found for id
Foo FindFoo(id); // Returns null if the Foo cannot be found.
void CreateFoo(id[, args]); // Creates a Foo with supplied args.

СТАРЫЙ ПОСТ - ИГНОР

Часто я использую этот стандарт:

GetFoo(); // Always returns a Foo, so creates if there isn't one already.
FindFoo(); // Returns null if the Foo cannot be found.

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

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

6 голосов
/ 06 августа 2009

Я бы пошел с EnsureFoo().

3 голосов
/ 06 августа 2009

Почему бы и нет:

private FooType m_foo;

public FooType Foo
{
   get
   {
      if (this.m_foo == null)
      {
         this.m_foo = new Foo();
      }
      return this.m_foo;
   }
   set
   {
      this.m_foo = value;
   }
}
3 голосов
/ 06 августа 2009

так ты хочешь быть создателем, верно? тогда ...

LetThereBeFoo();

хехехе

чтобы проверить, существует ли он

IsThereFoo();
3 голосов
/ 06 августа 2009

Это обычно известно как ленивое создание . Как насчет LazyGetFoo ()?

2 голосов
/ 06 августа 2009

Я думаю, просто иметь CreateFoo () хорошо. В документации должно быть указано, что функция делает в различных сценариях. Посмотрите на некоторые API-интерфейсы File I / O, например CreateFile (...) из Win32 API. На основе параметра он создаст новый файл или откроет существующий, если он существует. Ваш не обязательно должен быть основан на параметрах, но его поведение может отличаться в зависимости от состояния программы. Так что в принципе я думаю, что вы могли бы быть в том же духе.

1 голос
/ 06 августа 2009

Если ясно, что будет существовать только один объект Foo, я бы просто назвал его CreateFoo (), поскольку можно ожидать, что несколько вызовов создадут объект только один раз.

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

Если можно создать несколько объектов Foo и они не возвращаются, тогда я не уверен. Звучит как довольно странная ситуация для начала.

1 голос
/ 06 августа 2009

Я называю это RequireFoo().

0 голосов
/ 19 июля 2012

Я недавно начал использовать defineFoo(), так как заболел getOrCreateFoo()

...