Saqué el término pitufo de aquí (número 21). Para salvar a cualquiera que no esté familiarizado con el problema, el nombramiento de pitufos es el acto de prefijar un grupo de clases relacionadas, variables, etc. con un prefijo común para que termines con "a SmurfAccountView
pasa a SmurfAccountDTO
a SmurfAccountController
", etc.
La solución que generalmente he escuchado es crear un espacio de nombres de pitufo y soltar los prefijos de pitufo. En general, esto me ha servido bien, pero me encuentro con dos problemas.
Estoy trabajando con una biblioteca con una
Configuration
clase. Podría haberse llamadoWartmongerConfiguration
pero está en el espacio de nombres de Wartmonger, por lo que simplemente se llamaConfiguration
. También tengo unaConfiguration
clase que podría llamarseSmurfConfiguration
, pero está en el espacio de nombres de Smurf, por lo que sería redundante. Hay lugares en mi código dondeSmurf.Configuration
aparece juntoWartmonger.Configuration
y escribir nombres completos es torpe y hace que el código sea menos legible. Sería mejor tratar con unaSmurfConfiguration
y (si fuera mi código y no una biblioteca)WartmongerConfiguration
.Tengo una clase llamada
Service
en mi espacio de nombres Pitufo que podría haberse llamadoSmurfService
.Service
es una fachada en la parte superior de una compleja biblioteca de pitufos que ejecuta trabajos de pitufos.SmurfService
parece un nombre mejor porqueService
sin el prefijo Smurf es increíblemente genérico. Puedo aceptar queSmurfService
ya era un nombre genérico e inútil y eliminar el pitufo simplemente lo hizo más evidente. Pero podría haber sido nombradoRunner
,Launcher
etc. y todavía me "sentiría mejor"SmurfLauncher
porque no sé quéLauncher
hace, pero sé quéSmurfLauncher
hace. Se podría argumentar que lo queSmurf.Launcher
hace debe ser tan evidente como unSmurf.SmurfLauncher
, pero pude ver que `Smurf.Launcher es algún tipo de clase relacionada con la configuración en lugar de una clase que lanza pitufos.
Si hay una manera abierta y cerrada de lidiar con cualquiera de estos, sería genial. Si no, ¿cuáles son algunas prácticas comunes para mitigar su molestia?
fuente
Smurf.Launcher
Lanza pitufos o lanzaSmurfJob
s? Quizás podría llamarseSmurf.JobLauncher
?SmurfJob
ejecuta s, o técnicamente los ejecuta para que sean consistentes con el lenguaje de la documentación de Smurf. A la luz de eso y las otras respuestas, voy a cambiar el nombreSmurfService
aSmurfJobRunner
. Parece que el número 1 no tiene una mejor resolución agnóstica de lenguaje como esperaba. Puedo ver casos donde ir conSmurfConfiguration
sería la decisión correcta, pero en mi caso creo queConfiguration
es mejor incluso con la molestia deWartmonger.Configuration
.Smurf.Configuration
ySmurfConfiguration
sentirse diferente? Seguramente no es el char extra, ¿verdad? (Reduzca aConfig
si la longitud es el problema). ¿Smurf.Configuration
Tiene algún problema queSmurfConfiguration
no tenga ?Respuestas:
Subes algunos buenos puntos.
Con respecto a tener clases duplicadas, puede alias clases en C #. Use por ejemplo
using ColorScheme = The.Fully.Qualified.Namespace.Outlook2007ColorScheme;
Vea esta publicación en StackOverflow . No ha indicado su lenguaje de programación, pero lo he inferido de lo que ha escrito. Entonces, cuando se trata de dos proyectos diferentes, puede asignarles un aliasSmurfConfiguration
yWartmongerConfiguration
liberar la ambigüedad al consumir ambas clases.Como un servicio está expuesto a aplicaciones externas, no veo ningún problema en marcar el servicio con el nombre de su aplicación, por lo que en este caso
SmurfService
sería válido, ya que realmente desambiguaría grupos de servicios en la aplicación consumidora.Creo que los espacios de nombres deberían usarse para evitar este estilo de denominación. Hace que sea más difícil asimilar el código y ver al pie de la letra qué es una clase sin leer MyCompanyMyProductMyAreaClassName. El uso de la técnica de alias le permite reducir la ambigüedad donde sea necesario. La única vez que creo que deberías introducir complejidad en tu nomenclatura es, como he señalado en el n. ° 2, cuando las personas consumirán un servicio. Aquí es donde tiene mucho sentido tener este estilo de denominación porque si el consumidor tiene una variedad de servicios, está consumiendo la ambigüedad que podría ser confusa.
fuente
org.apache.smurfville.wartmonger.configuration
. Desafortunadamente, esto descarta los alias. 2 es un punto sólido, así que voy a mantener la marca Smurf para el Servicio.El objetivo de los espacios de nombres es que puede tener clases del mismo nombre de diferentes bibliotecas sin que colisionen. Cuando necesite usar la misma clase con nombre de ambos, debe eliminar la ambigüedad al anteponer uno o ambos con su ámbito de espacio de nombres.
Dicho esto, no es tan malo tener un montón de clases de Pitufo si Pitufo te dice algo específico sobre la clase. Los nombres de las clases deben ser lo suficientemente descriptivos como para brindarle información sobre lo que hace la clase.
Del mismo modo, un
DBSession
podría tomar unDBRequest
objeto que devuelve unDBResponse
objeto. ElHttpSession
poder también opera enHttpRequest
yHttpResponse
objetos.Estas son clases de pitufos con un propósito.
Podrían vivir en el
MyCompany
espacio de nombres, peroMyCompanyHttpSession
yMyCompanyDBSession
no le da más información que la que tenía antes. En este caso, suelte el Pitufo y conviértalo en un espacio de nombres.fuente
Me he encontrado con este mismo punto de confusión antes y generalmente es realmente una cuestión de si incluimos el tipo de cosas como parte de su nombre.
Usted menciona
SmurfConfiguration
yWartmongerConfiguration
como posibles tipos de configuraciones. Indicas que eliminaste el adjetivo (su tipo) a su espacio de nombres para que lo que te queda sea solo la vainillaConfiguration
. Evitaría hacer eso.Es como decidir que el helado de fresa es solo helado en el espacio de nombres de fresa e igualmente con chocolate, pero lo que sucedió es que te has divorciado del adjetivo que le da su identidad de la cosa misma. No es helado en la categoría de fresas. Es helado de fresa, una especie de helado.
Imaginemos que en su aplicación, importa la
Strawberry.IceCream
clase y luego comienza a crear instancias directamente desdeIceCream
.Esto puede parecer bien, hasta el momento en que terminas importando otra
IceCream
clase. Ahora vuelve al problema original de tener que distinguir de alguna manera entre ellos, lo cual es problemático. Lo que siempre quisiste fue:Es mejor dejar espacios de nombres para evitar posibles conflictos entre terceros que podrían representar los mismos conceptos en sus bibliotecas. Sin embargo, cuando un desarrollador crea una biblioteca o proyecto, debe nombrar cada concepto de manera única y usar espacios de nombres como carpetas solo para la organización. A menudo, el nombre de la carpeta se encuentra en el nombre de los conceptos que organiza y está bien.
fuente
Definitivamente es una buena regla general que si tienes un prefijo común en un grupo de clases, entonces probablemente merezcan ir a su propio espacio de nombres. Para lidiar con el problema, cuando necesite usar clases con nombres similares de dos espacios de nombres:
1) Alias los espacios de nombres, aunque lo haría corto y al grano, cualquier abreviatura natural, tal vez incluso solo 1 letra:
Luego, prefije siempre que se use y nombre las instancias adecuadamente:
2) Alias la clase, como se sugiere en otra respuesta.
3) Cualquier biblioteca sobre la que tenga control, considere no usar el término 'Configuración'. Utilice el diccionario de sinónimos: por ejemplo, 'Configuración', 'Modelo', 'Parámetros'. De todos modos, podría ser más significativo para el contexto: por ejemplo, si Smurf fuera algún tipo de módulo de análisis numérico que hubiera escrito, tal vez 'Parámetros' sería mejor para su configuración. Use el vocabulario particular asociado con el contexto de un módulo para su ventaja para encontrar nombres únicos que tengan unicidad incluso cuando se mezclan con otros espacios de nombres. Creo que esto podría ser una especie de respuesta a la pregunta OP 2.
4) Refactorice el código para que no tenga que mezclar el uso de la configuración desde dos lugares diferentes. Los detalles de eso dependen de usted.
5) Combina las dos configuraciones en una antes de pasarla a tu clase. Use una clase conf combinada para representar:
Los nombres cortos de las variables miembro ahora están logrando lo mismo que el alias de la clase / espacio de nombres.
fuente
Parece extraño que agregar un punto al nombre te moleste.
Si ambas
Smurf
y lasWartmonger
configuraciones se usan juntas en un lugar, pero por separado se usan en varios lugares, entonces el espacio de nombres es definitivamente un buen enfoque.Tener espacio de nombres dará posibilidad de utilizar nombres "limpias" en código interno, donde con prefijos que terminan usando
SmurfConfiguration
el interiorSmurfService
's código interno, que puede llegar a ser molesto cada vez que se abrirá ese código.fuente