¿Cómo nombrar a la fábrica como métodos?

146

Supongo que la mayoría de los métodos de fábrica comienzan con create. ¿Pero por qué se llaman " crear "? ¿Por qué no " hacer ", " producir ", " construir ", " generar " o algo más? ¿Es solo cuestión de gustos? ¿Una convención? ¿O hay un significado especial en "crear"?

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

¿Cuál elegirías en general y por qué?

deamon
fuente
44
Una vez trabajé en un proyecto que nombra los métodos de fábrica "get ()". Muy confuso al principio.
Muxecoid
44
Y la última opción, ¿qué tal sin prefijo? Dado que casi siempre usamos fábricas desde un contexto estático, ¿no debería estar claro? Solo pido estimular una discusión, mi preferencia personal es createXyz().
vikingsteve
@vikingsteve En un sistema que construí, utilicé el createprefijo como una convención en aras de la coherencia de la API y también porque al escribir la letra c, todos aparecerían en el autocompletado del IDE, lo que facilitaría para alguien que intenta saber qué hay disponible. Podría haber tenido Matrix4f.identity(), Matrix4f.transpose(), etc, pero que sería más rápido de encontrar como Matrix4f.createIdentity()e Matrix4f.createTranspose(...), etc
code_dredd

Respuestas:

117

Algunos pensamientos al azar:

  • 'Crear' se ajusta mejor a la función que la mayoría de las otras palabras. La siguiente mejor palabra que se me ocurre es "Construir". En el pasado, 'Alloc' (asignar) podría haberse utilizado en situaciones similares, lo que refleja el mayor énfasis en los bloques de datos que los objetos en lenguajes como C.

  • 'Crear' es una palabra corta y simple que tiene un significado intuitivo claro. En la mayoría de los casos, las personas probablemente solo lo eligen como la primera palabra más obvia que les viene a la mente cuando desean crear algo. Es una convención de nomenclatura común, y la "creación de objetos" es una forma común de describir el proceso de ... crear objetos.

  • 'Construir' está cerca, pero generalmente se usa para describir una etapa específica en el proceso de creación de un objeto (asignar / nuevo, construir, inicializar ...)

  • 'Build' y 'Make' son términos comunes para los procesos relacionados con la compilación de código, por lo que tienen diferentes connotaciones para los programadores, lo que implica un proceso que comprende muchos pasos y posiblemente mucha actividad de disco. Sin embargo, la idea de que una Fábrica "construya" algo es una idea sensata, especialmente en los casos en que se construye una estructura de datos compleja, o se combinan muchas piezas de información por separado.

  • 'Generar' para mí implica un cálculo que se utiliza para generar un valor a partir de una entrada, como generar un código hash o un número aleatorio.

  • 'Producir', 'Generar', 'Construir' son más largos de escribir / leer que 'Crear'. Históricamente, los programadores han favorecido los nombres cortos para reducir la escritura / lectura.

Jason Williams
fuente
55
aprobado para "Crear"
pimbrouwers
103

Joshua Bloch en "Java efectivo" sugiere las siguientes convenciones de nomenclatura

valueOf : devuelve una instancia que tiene, en términos generales, el mismo valor que sus parámetros. Tales fábricas estáticas son efectivamente métodos de conversión de tipo.

de - Una alternativa concisa a valueOf, popularizada por EnumSet(Ítem 32).

getInstance : devuelve una instancia que se describe mediante los parámetros pero que no se puede decir que tiene el mismo valor. En el caso de un singleton, getInstanceno toma parámetros y devuelve la única instancia.

newInstance - Me gusta getInstance, excepto que newInstancegarantiza que cada instancia devuelta es distinta de todas las demás.

get Type - Like getInstance, pero se usa cuando el método de fábrica está en una clase diferente. Tipo indica el tipo de objeto devuelto por el método de fábrica.

nuevo tipo : Me gusta newInstance, pero se usa cuando el método de fábrica está en una clase diferente. Tipo indica el tipo de objeto devuelto por el método de fábrica.

Jofsey
fuente
¿Cómo calificaría from? Por ejemplo, tomar un hipotético Id.of("abc")vs Id.from("xyz")... o fromsugeriría que ocurra más lógica (es decir, análisis de la entrada, búsqueda / correlación de / con otros datos, ...)? Es realmente difícil buscar "de vs de": D
knittl
22

Quería agregar un par de puntos que no veo en otras respuestas.

  1. Aunque tradicionalmente 'Fábrica' significa 'crea objetos', me gusta pensar en términos más generales como 'me devuelve un objeto que se comporta como espero'. No siempre debería saber si se trata de un objeto nuevo , de hecho, es posible que no me importe. Entonces, en casos adecuados, puede evitar el nombre 'Crear ...', incluso si así es como lo está implementando en este momento.

  2. La guayaba es un buen depósito de ideas de nombres de fábrica. Se está popularizando un buen estilo DSL. ejemplos:

    Lists.newArrayListWithCapacity(100);
    ImmutableList.of("Hello", "World");
    
Iain
fuente
1
Tienes razón, Guava es una gran biblioteca con código muy legible.
deamon
11

"Crear" y "crear" son cortos, razonablemente evocadores y no están vinculados a otros patrones de nombres que se me ocurran. También los he visto con bastante frecuencia y sospecho que pueden ser "estándares de facto". Elegiría uno y lo usaría consistentemente al menos dentro de un proyecto. (Mirando mi propio proyecto actual, parece que uso "make". Espero ser consistente ...)

Evite "compilar" porque encaja mejor con el patrón Builder y evite "producir" porque evoca Productor / Consumidor.

Para continuar realmente con la metáfora del nombre "Fábrica" ​​para el patrón, me sentiría tentado por "fabricar", pero esa es una palabra demasiado larga.

Don Roby
fuente
3

Creo que se deriva de " crear un objeto". Sin embargo, en inglés, la palabra "crear" se asocia con la noción "hacer que surja, como algo único que no evolucionaría naturalmente o que no está hecho por procesos ordinarios", y "evolucionar desde el propio pensamiento o imaginación, como una obra de arte o una invención ". Parece que "crear" no es la palabra adecuada para usar. "Hacer", por otro lado, significa "traer a la existencia dando forma o cambiando material, combinando partes, etc." Por ejemplo, no se crea un vestido, se hace un vestido (objeto). Entonces, en mi opinión, "hacer" con el significado de "producir; hacer que exista o suceda; provocar "es una palabra mucho mejor para los métodos de fábrica.

Frederik Krautwald
fuente
3

Me gusta lo nuevo. A mi

var foo = newFoo();

lee mejor que

var foo = createFoo();

Traducido al inglés tenemos foo es un nuevo foo o foo es create foo. Si bien no soy un experto en gramática, estoy bastante seguro de que este último es gramaticalmente incorrecto.

rjax
fuente
Ambos trabajan. createFooEs una función. foono lo es createFoo, como dices. fooes el resultado de createFoo().
Krzysztof Czelusniak
2

En parte convencional, en parte semántica.

Los métodos de fábrica (señalados por el tradicional create) deberían invocar a los constructores apropiados. Si lo viera buildURI, supondría que implicaba algún cálculo o ensamblaje a partir de piezas (y no pensaría que hubiera una fábrica involucrada). Lo primero que pensé cuando vi generateURIfue hacer algo al azar, como un nuevo enlace de descarga personalizado. No son todos iguales, palabras diferentes evocan significados diferentes; pero la mayoría de ellos no están convencionales.

Amadan
fuente
1

Yo lo llamaria UriFactory.Create()

Dónde,

UriFactoryes el nombre del tipo de clase que proporciona métodos que crean Uriinstancias.

y el Create()método está sobrecargado para tantas variaciones como tenga en sus especificaciones.

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

    //An overload for Create()
    public static UriType Create(someArgs) 
    {
    }
}
esta. __curious_geek
fuente
1
Si bien estoy de acuerdo con su nombre, no estoy de acuerdo con su convención sobre el uso de nombres de métodos con mayúsculas y minúsculas.
Chatatata
2
@Leviathlon siempre depende del lenguaje de programación y las convenciones internas. Pascal Case está totalmente bien para idiomas como C #.
momo
@momo Exactamente, creo que supuse que el lenguaje del que se habla es Java.
Chatatata
0

Señalaría que he visto todos los verbos pero produzco en uso en una biblioteca u otra, por lo que no llamaría a create como una convención universal.

Ahora, crear me suena mejor, evoca el significado preciso de la acción.

Entonces sí, es una cuestión de gusto (literario).

Vinko Vrsalovic
fuente
0

Personalmente me gusta instantiatey instantiateWith, pero eso es solo por mis experiencias con Unity y Objective C. Las convenciones de nomenclatura dentro del motor de Unity parecen girar en torno a la palabra instantiatepara crear una instancia a través de un método de fábrica, y parece que al Objetivo C le gusta withindicar cuáles son los parámetros. Sin embargo, esto solo funciona bien si el método está en la clase que se va a instanciar (y en los lenguajes que permiten la sobrecarga del constructor, esto no es tanto una 'cosa').

¡Simplemente, el viejo Objetivo C initWithtambién es bueno!

willsquire
fuente
-3

El método de fábrica no dicta el nombre del método. Puede tener tantos métodos como desee en su fábrica, siempre que todos devuelvan el objeto de la misma familia.

Para más detalles, visite la url http://xeon2k.wordpress.com

Nitina
fuente
44
el enlace no tiene sentido, debería ser más específico.
brunsgaard