2010-07-30 16 views
93

Immagino che la maggior parte dei metodi di fabbrica inizi con create. Ma perché si chiamano "create"? Perché non "make", "produce", "build", "generate" o qualcos'altro? È solo questione di gusti? Una convenzione? O c'è un significato speciale in "creare"?Come denominare metodi simili alla fabbrica?

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

Quale sceglieresti in generale e perché?

+3

Una volta ho lavorato a un progetto che indica i metodi factory "get()". Molto confuso all'inizio. – Muxecoid

+3

E l'ultima opzione, che ne dici di nessun prefisso? Dal momento che quasi sempre usiamo le fabbriche da un contesto statico, non dovrebbe essere chiaro? Sto solo chiedendo di stimolare qualche discussione - la mia preferenza personale è 'createXyz()'. – vikingsteve

+0

@vikingsteve In un sistema che ho creato, ho usato il prefisso 'create' come una questione di convenzione per motivi di coerenza * dell'API * e anche perché basta digitare la lettera' c' per far sì che tutti venissero visualizzati nell'IDE completamento automatico, che renderebbe più facile per qualcuno cercare di imparare ciò che è disponibile. Potrei aver avuto 'Matrix4f.identity()', 'Matrix4f.transpose() ', ecc. ma sarebbero più veloci da trovare come' Matrix4f.createIdentity() 'e' Matrix4f.createTranspose (...) ', ecc. – ray

risposta

75

Alcuni pensieri casuali:

  • 'Crea' si adatta la caratteristica migliore della maggior parte altre parole. La parola migliore che mi viene in mente è "Costruisci". In passato, "Alloc" (allocare) avrebbe potuto essere utilizzato in situazioni simili, riflettendo la maggiore enfasi sui blocchi di dati rispetto agli oggetti in lingue come C.

  • "Crea" è una parola breve, semplice che ha un chiaro significato intuitivo. Nella maggior parte dei casi, le persone probabilmente la scelgono come la prima e più ovvia parola che viene in mente quando desiderano creare qualcosa. È una convenzione di denominazione comune e la "creazione di oggetti" è un modo comune di descrivere il processo di ... creazione di oggetti.

  • 'costruire' è vicino, ma di solito è usato per descrivere una fase specifica del processo di creazione di un oggetto (allocare/nuovo, costruire, inizializzare ...)

  • 'costruire' e ' Rendono "termini comuni per i processi relativi al codice di compilazione, quindi hanno connotazioni diverse con i programmatori, implicando un processo che comprende molti passaggi e possibilmente un sacco di attività del disco. Tuttavia, l'idea di una fabbrica che "costruisce" qualcosa è un'idea sensata - specialmente nei casi in cui una struttura dati complessa è costruita, o molte informazioni separate sono combinate in qualche modo.

  • "Genera" implica un calcolo che viene utilizzato per produrre un valore da un input, ad esempio la generazione di un codice hash o un numero casuale.

  • 'Produce', 'Genera', 'Costruisci' sono più lunghi da digitare/leggere di 'Crea'. Storicamente i programmatori hanno preferito i nomi brevi per ridurre la digitazione/lettura.

+1

thumbs up per" Crea " – pimbrouwers

2

In parte convenzione, parzialmente semantica.

I metodi di fabbrica (segnalati dal tradizionale create) devono richiamare costruttori appropriati. Se vedessi buildURI, supporrei che implicasse un calcolo, o un assemblaggio da parti (e non penserei che ci fosse uno stabilimento coinvolto). La prima cosa che ho pensato quando ho visto generateURI sta creando qualcosa di casuale, come un nuovo link per il download personalizzato. Non sono tutti uguali, diverse parole evocano significati diversi; ma la maggior parte di loro non sono convenzionalizzati.

2

lo chiamerei UriFactory.Create()

Dove,

UriFactory è il nome del tipo di classe che è fornisce il metodo (s) che creano Uri istanze.

e Create() metodo è sovraccarico per l'altretanto come variazioni che avete nelle vostre specifiche.

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

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

mi piacerebbe sottolineare che ho visto tutti i verbi, ma produco in uso in qualche biblioteca o altro, in modo da non creare chiamare essendo una convenzione universale.

Ora, creare suona meglio per me, evoca il significato preciso dell'azione.

Quindi sì, è una questione di gusti (letteraria).

7

"Crea" e "fare" sono brevi, ragionevolmente evocativa, e non legato ad altri modelli nella denominazione che mi viene in mente. Ho anche visto entrambi abbastanza spesso e sospetto che potrebbero essere "standard de facto". Ne sceglierei uno e usarlo in modo coerente almeno all'interno di un progetto. (Guardando il mio progetto attuale, mi sembra di usare "make" .spero di essere coerente ...)

Evitare "build" perché si adatta meglio con il modello Builder ed evitare "produrre" perché evoca produttore/consumatore.

Per continuare veramente la metafora del nome "fabbrica" ​​per il modello, sarei tentato da "fabbricazione", ma questo è una parola troppo lunga.

-2

Il metodo di fabbrica non determina il nome del metodo. Puoi avere tutti i metodi che desideri nella tua fabbrica, a patto che tutti restituiscano l'oggetto dalla stessa famiglia.

Per maggiori dettagli, visitare l'url http://xeon2k.wordpress.com

+3

non ha senso, dovrebbe essere più specifico – brunsgaard

15

voluto aggiungere un paio di punti non vedo in altre risposte.

  1. Anche se tradizionalmente 'fabbrica' significa 'crea oggetti', mi piace pensare di esso in senso più ampio come 'mi restituisce un oggetto che si comporta come mi aspetto'. Non dovrei sempre sapere se si tratta di un oggetto nuovo , infatti non mi interessa. Quindi, in casi appropriati, potresti evitare il nome "Crea ...", anche se è così che stai implementando adesso.

  2. Guava è un buon archivio di idee denominazione di fabbrica. Sta diffondendo un bel stile DSL. esempi:

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

Hai ragione, Guava è una grande libreria con un codice molto leggibile. – deamon

3

penso che deriva da “per creare un oggetto”. Tuttavia, in inglese, la parola "creare" è associata alla nozione "di provocare la nascita, come qualcosa di unico che non si evolverebbe naturalmente o che non è fatto da processi ordinari" e "di evolvere dal proprio pensiero o immaginazione, come un'opera d'arte o un'invenzione. "Quindi sembra che" creare "sia non la parola corretta da usare. “Fare”, d'altra parte, vuol dire “portare all'esistenza per formare o materiale che cambia, combinando parti, ecc” Per esempio, non si crea un vestito, si effettua un abito (oggetto). Quindi, secondo me, "fare" nel senso di "produrre"; causa esistere o accadere; portare "è una parola molto migliore per i metodi di fabbrica.

60

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

valueOf - restituisce un'istanza che ha, in senso lato, lo stesso valore come i suoi parametri. Tali fabbriche statiche sono in effetti i metodi di conversione del tipo .

di - Una concisa alternativa a valueOf, resa popolare da EnumSet (elemento 32).

getInstance - Restituisce un'istanza descritta dai parametri ma non si può dire che abbia lo stesso valore. Nel caso di un singleton, getInstance non accetta parametri e restituisce l'unica istanza.

newInstance - Come getInstance, tranne che garantisce newInstance che ogni istanza restituito è distinto da tutti gli altri.

getType - Come getInstance, ma usato quando il metodo di fabbrica è in una classe diversa . Type indica il tipo di oggetto restituito dal metodo factory .

newType - Come newInstance, ma utilizzato quando il metodo factory è in una classe diversa. Type indica il tipo di oggetto restituito dal metodo factory .

0

Personalmente mi piace instantiate e instantiateWith, ma questo è solo a causa della mia Unità e Obiettivo esperienze C. Le convenzioni di denominazione all'interno del motore Unity sembrano ruotare attorno alla parola instantiate per creare un'istanza tramite un metodo factory e all'Objective C sembra piacere with per indicare quale sia il/i parametro/i. Questo funziona davvero bene solo se il metodo è nella classe che verrà istanziata (e nei linguaggi che consentono il sovraccarico del costruttore, questa non è tanto una "cosa").

Il semplice vecchio Objective C initWith è anche un bello!

1

Mi piace di nuovo. Per me

var foo = newFoo(); 

si legge meglio di

var foo = createFoo(); 

tradotto in inglese abbiamo foo è un nuovo pippo pippo o è creare foo. Anche se non sono un esperto di grammatica, sono abbastanza sicuro che quest'ultimo sia grammaticalmente scorretto.

Problemi correlati