Hace mucho tiempo leí un artículo (creo que es una entrada de blog) que me puso en la pista "correcta" en nombrar objetos: sea muy escrupuloso al nombrar cosas en su programa.
Por ejemplo, si mi solicitud fue (como una aplicación de negocios típico) el manejo de usuarios, empresas y direcciones que tendría un User
, una Company
, y una Address
clase de dominio - y probablemente en algún lugar de una UserManager
, una CompanyManager
y un AddressManager
surgiría que se encarga de esas cosas.
Así se puede saber lo que aquellos UserManager
, CompanyManager
y AddressManager
hacer? No, porque Administrador es un término muy genérico que se adapta a todo lo que puede hacer con sus objetos de dominio.
El artículo que leí recomienda usar nombres muy específicos. Si se tratara de una aplicación C ++ y el UserManager
trabajo de la persona fuera asignar y liberar a los usuarios del montón, no gestionaría a los usuarios sino que protegería su nacimiento y muerte. Hmm, tal vez podríamos llamar a esto a UserShepherd
.
O tal vez el UserManager
trabajo de este es examinar los datos de cada objeto de usuario y firmar los datos criptográficamente. Entonces tendríamos un UserRecordsClerk
.
Ahora que esta idea me quedó grabada, trato de aplicarla. Y encuentra esta idea simple increíblemente difícil.
Puedo describir lo que hacen las clases y (siempre y cuando no me meta en la codificación rápida y sucia) las clases que escribo hacen exactamente una cosa. Lo que echo de menos de esa descripción a los nombres es una especie de catálogo de nombres, un vocabulario que asigna los conceptos a los nombres.
En última instancia, me gustaría tener algo como un catálogo de patrones en mi mente (con frecuencia, los patrones de diseño proporcionan fácilmente los nombres de los objetos, por ejemplo, una fábrica )
- Fábrica: crea otros objetos (nombres tomados del patrón de diseño)
- Pastor: un pastor maneja la vida útil de los objetos, su creación y apagado
- Sincronizador: copia datos entre dos o más objetos (o jerarquías de objetos)
Niñera: ayuda a los objetos a alcanzar el estado "utilizable" después de la creación, por ejemplo, mediante el cableado a otros objetos
etcétera etcétera.
Entonces, ¿cómo manejas ese problema? ¿Tiene un vocabulario fijo, inventa nuevos nombres sobre la marcha o considera nombrar cosas no tan importantes o incorrectas?
PD: También me interesan los enlaces a artículos y blogs que discuten el tema. Para empezar, aquí está el artículo original que me hizo pensar en ello: nombrar clases de Java sin un "administrador"
Actualización: resumen de respuestas
Aquí hay un pequeño resumen de lo que aprendí de esta pregunta mientras tanto.
- Intenta no crear nuevas metáforas (niñera)
- Echa un vistazo a lo que hacen otros frameworks
Más artículos / libros sobre este tema:
- ¿Qué nombres te encuentras anteponiendo / agregando clases regularmente?
- ¿Cuál es el mejor enfoque para nombrar clases?
- Libro: Patrones de diseño: elementos de software orientado a objetos reutilizables (tapa dura)
- Libro: Patrones de arquitectura de aplicaciones empresariales (tapa dura)
- Libro: Patrones de implementación (rústica)
Y una lista actual de prefijos / sufijos de nombre que recopilé (¡subjetivamente!) De las respuestas:
- Coordinador
- Constructor
- Escritor
- Lector
- Manipulador
- Envase
- Protocolo
- Objetivo
- Convertidor
- Controlador
- Ver
- Fábrica
- Entidad
- Cubeta
Y un buen consejo para el camino:
No te pongas parálisis de nombres. Sí, los nombres son muy importantes, pero no son lo suficientemente importantes como para perder grandes cantidades de tiempo. Si no puede pensar en un buen nombre en 10 minutos, continúe.