Como nomear métodos de fábrica?

146

Eu acho que a maioria dos métodos de fábrica começa com create. Mas por que eles são chamados de " criar "? Por que não " fazer ", " produzir ", " construir ", " gerar " ou algo mais? É apenas uma questão de gosto? Uma convenção? Ou existe um significado especial em "criar"?

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

Qual você escolheria em geral e por quê?

Deamon
fonte
4
Uma vez trabalhei em um projeto que nomeia métodos de fábrica "get ()". Muito confuso no começo.
Muxecoid
4
E a última opção, que tal nenhum prefixo? Como quase sempre usamos fábricas de um contexto estático, não deveria ficar claro? Apenas pedindo para estimular alguma discussão - minha preferência pessoal é createXyz().
vikingsteve
@vikingsteve Em um sistema que eu construí, usei o createprefixo por uma questão de convenção por questões de consistência da API e também porque apenas digitar a letra cfaria com que todos aparecessem no preenchimento automático do IDE, o que tornaria mais fácil para alguém tentando aprender o que está disponível. Eu poderia ter tido Matrix4f.identity(), Matrix4f.transpose()etc., mas eles estariam mais rápida de encontrar como Matrix4f.createIdentity()e Matrix4f.createTranspose(...), etc.
code_dredd

Respostas:

117

Alguns pensamentos aleatórios:

  • 'Criar' se encaixa melhor no recurso do que na maioria das outras palavras. A próxima melhor palavra em que consigo pensar é 'Construir'. No passado, 'Alloc' (alocar) poderia ter sido usado em situações semelhantes, refletindo a maior ênfase em blocos de dados do que objetos em linguagens como C.

  • 'Criar' é uma palavra curta e simples que tem um significado intuitivo claro. Na maioria dos casos, as pessoas provavelmente a escolhem como a primeira palavra mais óbvia que vem à mente quando desejam criar algo. É uma convenção de nomenclatura comum e "criação de objetos" é uma maneira comum de descrever o processo de ... criação de objetos.

  • 'Construir' está próximo, mas geralmente é usado para descrever um estágio específico no processo de criação de um objeto (alocar / novo, construir, inicializar ...)

  • 'Build' e 'Make' são termos comuns para processos relacionados à compilação de código, portanto, possuem conotações diferentes para programadores, implicando um processo que compreende muitas etapas e possivelmente muita atividade do disco. No entanto, a idéia de uma fábrica "construindo" alguma coisa é uma idéia sensata - especialmente nos casos em que uma estrutura de dados complexa é construída, ou muitas informações separadas são combinadas de alguma maneira.

  • 'Gerar' para mim implica um cálculo que é usado para produzir um valor a partir de uma entrada, como gerar um código hash ou um número aleatório.

  • 'Produzir', 'Gerar', 'Construir' são mais longos para digitar / ler do que 'Criar'. Historicamente, os programadores preferem nomes curtos para reduzir a digitação / leitura.

Jason Williams
fonte
5
polegares para "Criar"
pimbrouwers
103

Joshua Bloch em "Java eficaz" sugere as seguintes convenções de nomenclatura

valueOf - Retorna uma instância que possui, vagamente, o mesmo valor que seus parâmetros. Tais fábricas estáticas são efetivamente métodos de conversão de tipos.

of - Uma alternativa concisa a valueOf, popularizada por EnumSet(Item 32).

getInstance - Retorna uma instância que é descrita pelos parâmetros, mas não se pode dizer que tenha o mesmo valor. No caso de um singleton, getInstancenão aceita parâmetros e retorna a única instância.

newInstance - Like getInstance, exceto que newInstancegarante que cada instância retornada seja distinta de todas as outras.

get Type - Like getInstance, mas usado quando o método de fábrica está em uma classe diferente. Tipo indica o tipo de objeto retornado pelo método de fábrica.

novo Tipo - Como newInstance, mas usado quando o método de fábrica está em uma classe diferente. Tipo indica o tipo de objeto retornado pelo método de fábrica.

Jofsey
fonte
Como você avaliaria from? Por exemplo, fazer um Id.of("abc")vs hipotético Id.from("xyz")… ou fromsugeriria mais lógica acontecendo (ou seja, análise da entrada, pesquisa / correlação de / com outros dados,…)? É realmente difícil procurar "de vs de": D
knittl
22

Queria adicionar alguns pontos que não vejo em outras respostas.

  1. Embora tradicionalmente "Fábrica" ​​signifique "crie objetos", gosto de pensar mais amplamente como "retorna para mim um objeto que se comporta como eu esperava". Eu nem sempre deveria saber se é um objeto novo , na verdade eu posso não me importar. Portanto, em casos adequados, você pode evitar um nome 'Criar ...', mesmo que seja assim que você o está implementando agora.

  2. A goiaba é um bom repositório de idéias de nomes de fábrica. Está popularizando um bom estilo DSL. exemplos:

    Lists.newArrayListWithCapacity(100);
    ImmutableList.of("Hello", "World");
    
Iain
fonte
1
Você está certo, o Guava é uma ótima biblioteca com código muito legível.
amigos estão dizendo sobre deamon
11

"Criar" e "criar" são curtos, razoavelmente evocativos e não estão vinculados a outros padrões de nomes em que consigo pensar. Eu também já vi isso com bastante frequência e suspeito que possam ser "padrões de fato". Eu escolheria um e o usaria consistentemente pelo menos dentro de um projeto. (Olhando para o meu próprio projeto atual, pareço usar "make". Espero ser consistente ...)

Evite "construir" porque ele se encaixa melhor com o padrão do Construtor e evite "produzir" porque evoca Produtor / Consumidor.

Para realmente continuar a metáfora do nome "Factory" para o padrão, eu ficaria tentado pelo "fabric", mas é uma palavra muito longa.

Don Roby
fonte
3

Eu acho que deriva de " criar um objeto". No entanto, em inglês, a palavra “criar” está associada à noção de “fazer surgir, como algo único que não evoluiria naturalmente ou que não é produzido por processos comuns” e “evoluir a partir do próprio pensamento ou imaginação, como obra de arte ou invenção. " Portanto, parece que "criar" não é a palavra correta a ser usada. “Criar”, por outro lado, significa “tornar realidade moldando ou trocando materiais, combinando peças etc.” Por exemplo, você não cria um vestido, faz um vestido (objeto). Então, na minha opinião, "faça", significando "produzir; fazer existir ou acontecer; criar ”é uma palavra muito melhor para métodos de fábrica.

Frederik Krautwald
fonte
3

Eu gosto de novo Para mim

var foo = newFoo();

lê melhor que

var foo = createFoo();

Traduzido para o inglês, temos foo é um novo foo ou foo é create foo. Embora não seja especialista em gramática, tenho certeza de que o último é gramaticalmente incorreto.

rjax
fonte
Ambos trabalham. createFooé uma função. foonão é createFoo, como você diz. fooé um resultado de createFoo().
Krzysztof Czelusniak 12/03/19
2

Parcialmente convenção, parcialmente semântica.

Os métodos de fábrica (sinalizados pelo tradicional create) devem chamar os construtores apropriados. Se eu visse buildURI, eu assumiria que isso envolvia algum cálculo ou montagem de peças (e eu não pensaria que havia uma fábrica envolvida). A primeira coisa que pensei quando vi generateURIfoi criar algo aleatório, como um novo link de download personalizado. Eles não são todos iguais, palavras diferentes evocam significados diferentes; mas a maioria deles não é convencionalizada.

Amadan
fonte
1

Eu chamaria isso UriFactory.Create()

Onde,

UriFactoryé o nome do tipo de classe que fornece métodos que criam Uriinstâncias.

e o Create()método está sobrecarregado para tantas variações nas suas especificações.

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

    //An overload for Create()
    public static UriType Create(someArgs) 
    {
    }
}
isto. __curious_geek
fonte
1
Embora eu concorde com a sua nomeação, discordo totalmente da sua convenção sobre o uso de nomes de métodos em Pascal.
Chatatata 18/11/19
2
@ Leviathlon sempre depende da linguagem de programação e das convenções internas. Pascal Case é totalmente adequado para idiomas como C #.
momo
@ momo Exatamente, acho que tive uma suposição de que a linguagem que está sendo falada é Java.
Chatatata 28/02/19
0

Eu apontaria que vi todos os verbos, mas que são produzidos em uso em alguma biblioteca ou outra, então não chamaria de criar uma convenção universal.

Agora, criar soa melhor para mim, evoca o significado preciso da ação.

Então, sim, é uma questão de gosto (literário).

Vinko Vrsalovic
fonte
0

Pessoalmente, eu gosto instantiatee instantiateWith, mas isso é apenas por causa das minhas experiências de Unidade e Objetivo C. As convenções de nomenclatura no mecanismo do Unity parecem girar em torno da palavra instantiatepara criar uma instância por meio de um método de fábrica, e o Objetivo C parece gostar withde indicar quais são os parâmetros. Isso realmente funciona bem se o método estiver na classe que será instanciada (e em linguagens que permitem sobrecarga de construtores, isso não é uma coisa '').

Simplesmente velhos Objective C's initWithtambém são uma boa opção!

requerer
fonte
-3

O método de fábrica não determina o nome do método. Você pode ter quantos métodos desejar em sua fábrica, desde que todos retornem o objeto da mesma família.

Para mais detalhes, visite o URL http://xeon2k.wordpress.com

Nitin
fonte
4
link não faz sentido, deve ser mais específico.
Brunsgaard 03/03