Как назвать фабрику подобными методами? - PullRequest
122 голосов
/ 30 июля 2010

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

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

Какой из них вы бы выбрали в общем и почему?

Ответы [ 11 ]

97 голосов
/ 30 июля 2010

Несколько случайных мыслей:

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

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

  • «Конструкт» близок, но обычно используется дляописать конкретную стадию в процессе создания объекта (allocate / new, construct, initialize ...)

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

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

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

85 голосов
/ 16 марта 2014

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

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

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

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

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

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

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

20 голосов
/ 06 декабря 2012

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

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

  2. Гуава - хороший репозиторий фабричных именных идей. Он популяризирует хороший стиль DSL. Примеры:

    Lists.newArrayListWithCapacity(100);
    ImmutableList.of("Hello", "World");
    
9 голосов
/ 31 июля 2010

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

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

Чтобы по-настоящему продолжить метафору имени «Фабрика» для шаблона, я бы соблазнился «изготовлением», но это слишком длинное слово.

3 голосов
/ 09 февраля 2013

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

2 голосов
/ 30 июля 2010

Частично соглашение, частично семантика.

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

1 голос
/ 19 января 2018

Мне нравится новый.Для меня

var foo = newFoo();

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

var foo = createFoo();

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

1 голос
/ 30 июля 2010

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

Где,

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

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

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

    //An overload for Create()
    public static UriType Create(someArgs) 
    {
    }
}
0 голосов
/ 06 августа 2015

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

Просто старыйЦель C's initWith - это тоже хорошая вещь!

0 голосов
/ 27 ноября 2010

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

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

...