2010-07-30 9 views
93

Supongo que la mayoría de los métodos tipo fábrica comienzan con create. ¿Pero por qué se llaman "create"? ¿Por qué no "make", "produce", "build", "generate" o algo más? ¿Es solo una cuestión de gusto? ¿Una convención? ¿O hay un significado especial en "crear"?¿Cómo nombrar métodos similares a los de fábrica?

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

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

+3

Una vez trabajé en un proyecto que nombra métodos de fábrica "get()". Muy confuso al principio. – Muxecoid

+3

Y la última opción, ¿qué tal si no hay prefijo? Dado que casi siempre estamos utilizando fábricas de un contexto estático, ¿no debería estar claro? Simplemente solicitando un poco de discusión: mi preferencia personal es 'createXyz()'. – vikingsteve

+0

@vikingsteve En un sistema que construí, utilicé el prefijo 'create' como una cuestión de convención por el bien de la consistencia API * y también porque simplemente escribiendo la letra' c' haría que todos aparezcan en el IDE. autocompletar, lo que facilitaría que alguien intente aprender lo que está disponible. Pude haber tenido 'Matrix4f.identity()', 'Matrix4f.transpose() ', etc. pero serían más rápidos de encontrar como' Matrix4f.createIdentity() 'y' Matrix4f.createTranspose (...) ', etc. – ray

Respuesta

75

algunos pensamientos al azar:

  • 'crear' se ajusta a la función mejor que la mayoría de las otras palabras. La siguiente mejor palabra que puedo pensar en la parte superior de mi cabeza es 'Construir'. En el pasado, 'Alloc' (allocate) podría haberse utilizado en situaciones similares, lo que refleja un mayor énfasis en bloques de datos que los objetos en idiomas como C.

  • 'Crear' es una palabra breve y simple que tiene claro significado intuitivo. En la mayoría de los casos, las personas probablemente solo lo eligen como la primera palabra más obvia que se 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 ... creación de objetos.

  • 'Construir' está cerca, pero por lo general 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 una "construcción" de algo en la fábrica 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.

  • 'Produce', 'Generate', 'Construct' son más largos de escribir/leer que 'Crear'. Históricamente, los programadores han preferido los nombres cortos para reducir el tipeo/lectura.

+1

thumbs up para" Crear " – pimbrouwers

2

En parte convencional, en parte semántica.

Los métodos de fábrica (señalados por el tradicional create) deben invocar a los constructores apropiados. Si viera buildURI, supondría que se trataba de algún cálculo, o ensamblaje a partir de partes (y no creo que haya una fábrica involucrada). Lo primero que pensé cuando vi generateURI es hacer algo al azar, como un nuevo enlace de descarga personalizado. No son todos iguales, las diferentes palabras evocan significados diferentes; pero la mayoría de ellos no están convencionalizados.

2

lo llamaría UriFactory.Create()

Cuando,

UriFactory es el nombre del tipo de clase que es proporciona un método (s) que crean Uri casos.

y Create() método está sobrecargado por tantas variaciones que tenga en sus especificaciones.

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

    //An overload for Create() 
    public static UriType Create(someArgs) 
    { 
    } 
} 
0

me gustaría señalar que he visto todos los verbos, pero producen en uso en alguna biblioteca o de otro tipo, así que no llamaría a crear tratarse de un convenio universal.

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

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

7

"Crear" y "hacer" son breves, razonablemente evocadoras, y no están relacionadas con otros patrones de nomenclatura que se me ocurren. También he visto las dos 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 "hacer". Espero que sea consistente ...)

Evite "compilar" porque se ajusta mejor con el patrón del Constructor y evite "producir" porque evoca Productor/Consumidor.

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

-2

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

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

+3

enlace no tiene sentido, debería ser más específico. – brunsgaard

15

quería añadir un par de puntos que no veo en otras respuestas.

  1. Aunque tradicionalmente los medios 'de fábrica' 'crea objetos', me gusta pensar en ella en términos más generales como 'me devuelve un objeto que se comporta como espero'. No siempre tengo que saber si es un nuevo objeto , de hecho, puede que no me importe. Por lo tanto, en casos adecuados, puede evitar el nombre 'Crear ...', incluso si así es como lo está implementando en este momento.

  2. Guava es un buen repositorio de ideas de nombres de fábrica. Está popularizando un buen estilo de DSL. ejemplos:

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

Tienes razón, Guava es una gran biblioteca con un código muy legible. – deamon

3

creo que se debe a “a crear un objeto”. Sin embargo, en inglés, la palabra "crear" está asociada con la noción "hacer que surja el ser, como algo único que no evolucionaría naturalmente o que no está hecho por procesos ordinarios", y "evolucionar a partir del propio pensamiento o imaginación, como una obra de arte o una invención. "Entonces parece que" crear "es no la palabra adecuada para usar. "Hacer", por otro lado, significa "crearlo al darle forma o cambiar el material, combinar partes, etc." Por ejemplo, no hace crear un vestido, hacer un vestido (objeto). Entonces, en mi opinión, "hacer" por significado "producir; causa de existir o suceder; traer "es una palabra mucho mejor para los métodos de fábrica.

60

Joshua Bloch en "Effective Java" suggests the following naming conventions

valueOf - Devuelve una instancia que tiene, hablando vagamente, el mismo valor como sus parámetros. Tales fábricas estáticas son efectivamente métodos de conversión de tipo.

de - Una alternativa concisa a valueOf, popularizado por EnumSet (artículo 32).

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

newInstance - Al igual que getInstance, excepto que newInstance garantiza que cada instancia devuelta es distinta de todas las demás.

getType - Me gusta 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 .

newType - 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 .

0

Personalmente me gusta instantiate y instantiateWith, pero eso es sólo debido a mi Unidad y experiencias Objective C. Las convenciones de nomenclatura dentro del motor de Unity parecen girar alrededor de la palabra instantiate para crear una instancia mediante un método de fábrica, y el objetivo C parece gustarle with para indicar cuáles son los parámetros. Esto solo funciona bien si el método está en la clase que se va a crear una instancia (y en los lenguajes que permiten la sobrecarga del constructor, esto no es una 'cosa').

¡Simplemente viejo objetivo C initWith también es bueno!

1

Me gusta nuevo. Para mí

var foo = newFoo(); 

lee mejor que

var foo = createFoo(); 

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

Cuestiones relacionadas