2010-07-30 2 views
93

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

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

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

+3

Я когда-то работал над проектом, который называет заводские методы «get()». Сначала очень запутанно. – Muxecoid

+3

И последний вариант, как насчет префикса? Поскольку мы почти всегда используем фабрики из статического контекста, не должно ли это быть ясным? Просто прошу подвести некоторые обсуждения - мои личные предпочтения - 'createXyz()'. – vikingsteve

+0

@vikingsteve В системе, которую я построил, я использовал префикс 'create' в качестве соглашения для согласования API *, а также потому, что просто набрав букву' c', все они появятся в среде IDE. автозаполнение, что упростит для кого-то, кто пытается узнать, что доступно. Я мог бы иметь Matrix4f.identity() ',' Matrix4f.transpose() 'и т. д., но их было бы быстрее найти как« Matrix4f.createIdentity() »и« Matrix4f.createTranspose (...) »и т. д. – ray

ответ

75

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

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

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

  • «Построить» близко, но это, как правило, используется для описания определенного этапа в процессе создания объекта (выделить/новый, строить, инициализируется ...)

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

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

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

+1

палец вверх для ссылки« Создать » – pimbrouwers

2

Частично конвенции, частично семантики.

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

2

Я бы назвал это 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

Я бы указать на то, что я видел все глаголы, но производят в использовании в той или иной библиотеке или другой, так что я бы не назвал создание будучи универсальной конвенции.

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

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

7

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

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

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

-2

Заводской метод не диктует имя метода. На вашем заводе может быть так много методов, при условии, что все они возвратят объект из того же семейства.

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

+3

не имеет смысла, должен быть более конкретным. – brunsgaard

15

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

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

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

    Lists.newArrayListWithCapacity(100); 
    ImmutableList.of("Hello", "World"); 
    
+1

Вы правы, Гува - отличная библиотека с очень читаемым кодом. – deamon

3

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

60

Joshua Bloch в "Эффективное Java" suggests the following naming conventions

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

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

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

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

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

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

0

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

Простая старая цель initWith - тоже добро!

1

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

var foo = newFoo(); 

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

var foo = createFoo(); 

Перевод на английский у нас есть Foo новый Foo или Foo является создание Foo. Хотя я не специалист по грамматике, я почти уверен, что последнее является грамматически неправильным.

Смежные вопросы