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


151

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

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

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


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. Хотя я не специалист по грамматике, я почти уверен, что последнее грамматически неверно.


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) 
    {
    }
}

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.