que tienen una estructura que se puede representar muy fácilmente usando un diccionario anidada de tres de profundidad, al igual que¿Es un diccionario anidado profundo un antipatrón?
private static Dictionary<string, Dictionary<string, Dictionary<string,string>>> PrerenderedTemplates;
Cuando la estructura se podría utilizar algo como esto
PrerenderedTemplates[instanceID][templategroup][templatepart]
Ahora, darse cuenta de que este código es difícil de leer porque, al mirar la declaración de definición, no se puede decir para qué se está utilizando. La única ventaja que realmente puedo ver al cambiarlo a Dictionary<string, PrerenderedTemplate>
es la legibilidad. La conversión de cada anidación en su propia clase (por ejemplo, class PrerenderedTemplate{} class TemplateGroup{} class TemplatePart{}
) agregaría muchas más líneas de código para una pequeña ventaja computacional (si la hubiera). Por lo que puedo ver.
- Entonces, ¿mi enfoque es "correcto" o debería hacer un esfuerzo adicional y crear clases separadas?
- ¿Está bien que cubra cómo funciona el
Dictionary
anidado en la documentación/comentarios - ¿Existe una mejor práctica para manejar este tipo de anidación?
- Tenga en cuenta que este es un miembro privado, no es necesario que sea sencillo para las personas que usan la clase.
actualización
Así, inspirado por Reza, pero no puede utilizar tuplas, decidí crear mi propio generador de clave y poner en práctica su patrón de esta manera:
private Dictionary<string, string> PrerenderedTemplates;
private string GetPrerenderedTemplateKey(string InstanceId, string FeatureId, string OptionId)
{
return new StringBuilder(instanceId)
.Append(FormatTools.LIST_ENTRY_DELIMITER)
.Append(templategroup)
.Append(FormatTools.LIST_ENTRY_DELIMITER)
.Append(templatepart).ToString();
}
Dónde FormatTools.LIST_ENTRY_DELIMITER
es el carácter de uso privado Unicode 0xe04d
.
Dado que las dos primeras agrupaciones son esencialmente solo identificadores, quizás podría salirse con la suya con un simple diccionario. Entonces 'PrerenderedTemplates [" instance1 "] [" fruit "] [" banana "]' podría representarse como 'PrerenderedTemplates [" instance1_fruit_banana "]', como un espacio de nombres. –
¿Necesita la capacidad de utilizar 'PrerenderedTemplates' para listar sus grupos de plantillas o partes de plantilla? Más o menos en el estilo de 'PrerenderedTemplates [instanceID]. Keys' o' PrerenderedTemplates [instanceID] [templateGroup] '? Si es así, esta es probablemente la forma más fácil de manejarlo. –
@ M.Babcock, bueno, estoy recorriendo una colección de objetos que contienen metadatos que apuntan a cómo renderizar una plantilla. Antes de representar esa plantilla, quiero verificar mi diccionario para asegurarme de que no se haya procesado antes. Si no lo ha hecho, lo renderizo y agrego el resultado a mi Diccionario. (La gestión del cambio de plantilla se maneja en otro lado) –