Molto tempo fa ho letto un articolo (credo un post di blog) che mi ha messo sulla strada "giusta" per la denominazione degli oggetti: sii molto scrupoloso nel nominare le cose nel tuo programma.
Ad esempio, se la mia applicazione (come una tipica app aziendale) gestisse utenti, aziende e indirizzi, avrei una classe a User
, a Company
e una di Address
dominio - e probabilmente da qualche parte comparirebbero a UserManager
, a CompanyManager
e AddressManager
a che gestiscono tali cose.
Così si può dire ciò che coloro UserManager
, CompanyManager
e AddressManager
fare? No, perché Manager è un termine molto generico che si adatta a qualsiasi cosa tu possa fare con i tuoi oggetti di dominio.
L'articolo che ho letto mi ha raccomandato di usare nomi molto specifici. Se si trattasse di un'applicazione C ++ e il UserManager
lavoro fosse quello di allocare e liberare gli utenti dall'heap, non li avrebbe gestiti ma salvaguardati la loro nascita e morte. Hmm, forse potremmo chiamarlo a UserShepherd
.
O forse il UserManager
compito è quello di esaminare i dati di ciascun oggetto Utente e firmarli crittograficamente. Quindi avremmo un UserRecordsClerk
.
Ora che questa idea mi è rimasta, provo ad applicarla. E trova questa idea semplice incredibilmente difficile.
Posso descrivere cosa fanno le classi e (purché non scivoli nella codifica veloce e sporca) le classi che scrivo fanno esattamente una cosa. Quello che mi manca per passare da quella descrizione ai nomi è una specie di catalogo di nomi, un vocabolario che associa i concetti ai nomi.
Alla fine mi piacerebbe avere qualcosa come un catalogo di modelli nella mia mente (spesso i modelli di progettazione forniscono facilmente i nomi degli oggetti, ad esempio una fabbrica )
- Factory: crea altri oggetti (denominazione presa dal modello di progettazione)
- Pastore - Un pastore gestisce la vita degli oggetti, la loro creazione e spegnimento
- Sincronizzatore: copia i dati tra due o più oggetti (o gerarchie di oggetti)
Tata: aiuta gli oggetti a raggiungere lo stato "utilizzabile" dopo la creazione, ad esempio collegando altri oggetti
ecc ecc.
Quindi, come gestite questo problema? Hai un vocabolario fisso, inventi al volo nuovi nomi o pensi di nominare cose non così importanti o sbagliate?
PS: Sono anche interessato a link ad articoli e blog che trattano il problema. Come inizio, ecco l'articolo originale che mi ha fatto riflettere: nominare le classi Java senza un "Manager"
Aggiornamento: riepilogo delle risposte
Ecco un breve riassunto di ciò che ho imparato da questa domanda nel frattempo.
- Cerca di non creare nuove metafore (Tata)
- Dai un'occhiata a cosa fanno gli altri framework
Ulteriori articoli / libri su questo argomento:
- Quali nomi ti trovi ad anteporre / aggiungere regolarmente alle lezioni?
- Qual è l'approccio migliore alle classi di denominazione?
- Libro: Modelli di progettazione: elementi di software riutilizzabile orientato agli oggetti (copertina rigida)
- Libro: Patterns of Enterprise Application Architecture (Hardcover)
- Libro: Implementation Patterns (Paperback)
E un elenco attuale di prefissi / suffissi di nome che ho raccolto (soggettivamente!) Dalle risposte:
- Coordinatore
- Costruttore
- scrittore
- Lettore
- handler
- Contenitore
- Protocollo
- Bersaglio
- Converter
- controllore
- Visualizza
- Fabbrica
- Entità
- Secchio
E un buon consiglio per la strada:
Non ottenere la paralisi dei nomi. Sì, i nomi sono molto importanti ma non sono abbastanza importanti da perdere enormi quantità di tempo. Se non riesci a trovare un buon nome in 10 minuti, vai avanti.