Как назвать фабричные методы?

151

Я думаю, что большинство фабричных методов начинаются с create. Но почему они называются « создавать »? Почему бы не « делать », « производить », « строить », « генерировать » или что-то еще? Это только вопрос вкуса? Соглашение? Или в слове «создавать» есть особый смысл?

createURI(...) 
makeURI(...)
produceURI(...)
buildURI(...)
generateURI(...)

Что бы вы выбрали в целом и почему?

Deamon
источник
4
Однажды я работал над проектом, который называет фабричные методы get (). Поначалу очень сбивает с толку.
Muxecoid
4
И последний вариант, как насчет без приставки? Разве это не должно быть ясно, поскольку мы почти всегда используем фабрики из статического контекста? Просто прошу подстегнуть дискуссию - мои личные предпочтения createXyz().
vikingsteve
@vikingsteve В системе, которую я построил, я использовал createпрефикс по соглашению для согласованности API, а также потому, что простой ввод буквы cприведет к тому, что все они будут отображаться в автозаполнении IDE, что упростит для тех, кто пытается узнать, что доступно. Я мог бы имел Matrix4f.identity(), Matrix4f.transpose()и т.д. , но они будут быстрее найти , как Matrix4f.createIdentity()и Matrix4f.createTranspose(...)т.д.
code_dredd

Ответы:

124

Некоторые случайные мысли:

  • «Создать» подходит для этой функции лучше, чем большинство других слов. Следующее лучшее слово, которое я могу придумать, - это «конструировать». В прошлом «Alloc» (выделить) могло использоваться в аналогичных ситуациях, отражая больший упор на блоки данных, чем на объекты в таких языках, как C.

  • «Создавать» - это короткое простое слово, имеющее ясное интуитивное значение. В большинстве случаев люди, вероятно, просто выбирают его как первое, наиболее очевидное слово, которое приходит на ум, когда они хотят что-то создать. Это обычное соглашение об именах, а «создание объекта» - это общий способ описания процесса ... создания объектов.

  • 'Construct' - это близко, но обычно используется для описания определенного этапа в процессе создания объекта (выделить / создать, построить, инициализировать ...)

  • «Сборка» и «Создание» - общие термины для процессов, относящихся к компиляции кода, поэтому имеют разные значения для программистов, подразумевая процесс, который включает много шагов и, возможно, большую активность диска. Однако идея фабрики, «строящей» что-то, является разумной идеей, особенно в случаях, когда построена сложная структура данных или когда каким-то образом объединены многие отдельные части информации.

  • «Генерировать» для меня подразумевает вычисление, которое используется для получения значения из ввода, такого как генерация хэш-кода или случайного числа.

  • «Produce», «Generate», «Construct» длиннее для ввода / чтения, чем «Create». Исторически сложилось так, что программисты предпочитали короткие имена, чтобы сократить ввод / чтение.

Джейсон Уильямс
источник
5
большие пальцы на «Создать»
ПИМ
107

Джошуа Блох в «Эффективной Java» предлагает следующие соглашения об именах

valueOf - возвращает экземпляр, который, грубо говоря, имеет то же значение, что и его параметры. Такие статические фабрики - эффективные методы преобразования типов.

of - Краткая альтернатива valueOf, популяризированная EnumSet(Пункт 32).

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

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

get Type - Подобно getInstance, но используется, когда фабричный метод находится в другом классе. Тип указывает тип объекта, возвращаемого фабричным методом.

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

Джофси
источник
Как бы вы оценили from? Например, если взять гипотетическое Id.of("abc")против Id.from("xyz")… или fromпредложить больше логики (например, синтаксический анализ ввода, поиск / корреляция с / с другими данными,…)? Искать "of vs from" действительно сложно: D
knittl
22

Хотел добавить пару моментов, которых не вижу в других ответах.

  1. Хотя традиционно «Factory» означает «создает объекты», мне нравится думать об этом в более широком смысле, как «возвращает мне объект, который ведет себя так, как я ожидал». Мне не всегда нужно знать, новый ли это объект , на самом деле меня это может не волновать. Так что в подходящих случаях вы можете избежать имени «Создать ...», даже если именно так вы его реализуете прямо сейчас.

  2. Guava - хорошее хранилище идей фабричного именования. Это популяризация красивого стиля DSL. Примеры:

    Lists.newArrayListWithCapacity(100);
    ImmutableList.of("Hello", "World");
    
Иэн
источник
1
Вы правы, Guava - отличная библиотека с очень читаемым кодом.
deamon
11

«Create» и «make» короткие, достаточно вызывающие воспоминания и не привязанные к другим шаблонам именования, которые я могу придумать. Я также довольно часто видел и то, и другое и подозреваю, что они могут быть «стандартами де-факто». Я бы выбрал один и постоянно использовал его, по крайней мере, в рамках проекта. (Глядя на мой собственный текущий проект, я, кажется, использую "make". Надеюсь, я последователен ...)

Избегайте «строить», потому что это лучше соответствует паттерну «Строитель», и избегайте «производить», потому что оно вызывает у производителя / потребителя.

Продолжая метафору названия паттерна «Factory», меня соблазнит «производство», но это слишком длинное слово.

Дон Роби
источник
4

Я думаю, что это происходит от « создать объект». Однако в английском языке слово «создавать» ассоциируется с понятием «вызывать возникновение как нечто уникальное, которое не может развиваться естественным образом или не создается обычными процессами», и «развиваться из собственной мысли или воображение, как произведение искусства или изобретение ». Таким образом, кажется, что «создавать» - не подходящее слово. «Создавать», с другой стороны, означает «создавать, формируя или изменяя материал, комбинируя части и т. Д.» Например, вы не создать платье, вы сделать платье (объект). Поэтому, на мой взгляд, «производить» означает «производить; причина существования или возникновения; вызвать »- это гораздо более подходящее слово для фабричных методов.

Фредерик Краутвальд
источник
3

Люблю новое. Мне

var foo = newFoo();

читает лучше, чем

var foo = createFoo();

В переводе на английский мы имеем foo - это новый foo или foo - это create foo. Хотя я не специалист по грамматике, я почти уверен, что последнее грамматически неверно.

rjax
источник
1
Они оба работают. createFooэто функция. fooнет createFoo, как вы говорите. fooявляется результатом createFoo().
Krzysztof Czelusniak
2

Отчасти условность, отчасти семантика.

Фабричные методы (сигнализируемые традиционными create) должны вызывать соответствующие конструкторы. Если бы я увидел buildURI, я бы предположил, что это связано с некоторыми вычислениями или сборкой из частей (и я бы не подумал, что это была фабрика). Первое, что я подумал, когда увидел, generateURI- это создание чего-то случайного, например, новой персональной ссылки для скачивания. Они не все одинаковы, разные слова имеют разное значение; но большинство из них не стилизованы.

Амадан
источник
1

Я бы назвал это UriFactory.Create()

Куда,

UriFactory- это имя типа класса, который предоставляет метод (ы) для создания Uriэкземпляров.

и Create()метод перегружен столько, сколько вариантов есть в ваших спецификациях.

public static class UriFactory
{
    //Default Creator
    public static UriType Create() 
    {
    }

    //An overload for Create()
    public static UriType Create(someArgs) 
    {
    }
}
этот. __curious_geek
источник
1
Хотя я согласен с вашим наименованием, я категорически не согласен с вашим соглашением об использовании имен методов в паскале.
Buğra Ekuklu
2
@Leviathlon всегда зависит от языка программирования и внутренних соглашений. Pascal Case полностью подходит для таких языков, как C #.
momo
@momo Точно, я думаю, я предполагал, что речь идет о языке Java.
Buğra Ekuklu
0

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

Теперь create действительно звучит лучше для меня, пробуждает точное значение действия.

Так что да, это вопрос (литературного) вкуса.

Винко Врсалович
источник
0

Лично мне нравится instantiateи instantiateWith, но это только из-за моего опыта работы с Unity и Objective C. Соглашения об именах внутри движка Unity, похоже, вращаются вокруг слова instantiateдля создания экземпляра с помощью фабричного метода, а Objective C, похоже, любит withуказывать, что такое параметр / параметры. Это действительно хорошо работает только в том случае, если метод находится в классе, экземпляр которого будет создан (и в языках, допускающих перегрузку конструктора, это не такая уж большая «вещь»).

Просто старый initWithдобрый Objective C тоже хорош!

Уилл Сквайр
источник
-3

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

Для получения дополнительной информации посетите URL-адрес http://xeon2k.wordpress.com

Нитин
источник
4
ссылка не имеет смысла, надо конкретнее.
brunsgaard 03