Является ли словарь с глубокой вложенностью антипаттерном?

У меня есть структура, которая может быть очень легко представлена ​​с помощью трехуровневого вложенного словаря, например так

private static Dictionary<string, Dictionary<string, Dictionary<string,string>>> PrerenderedTemplates;

Где структура может использоваться примерно так

PrerenderedTemplates[instanceID][templategroup][templatepart]

Теперь я понимаю, что этот код трудно читать, потому что, глядя на определение, вы не можете понять, для чего оно используется. Единственное преимущество, которое я действительно вижу в изменении его на Dictionary , - это удобочитаемость. Преобразование каждого вложения в отдельный класс (например, class PrerenderedTemplate {} class TemplateGroup {} class TemplatePart {} ) добавило бы намного больше строк кода для небольшого (если таковое имеется) вычислительного преимущества. Насколько я вижу.

  • Итак, мой подход «в порядке», или я должен приложить дополнительные усилия и создать отдельные классы?
  • Можно ли описать, как работает вложенный Словарь , в документации / комментариях.
  • Есть ли лучший способ обработки такого рода вложений?
  • Имейте в виду, что это частный член, это не должно быть простым для людей, использующих класс.

Обновление

Итак, вдохновленный Резой, но неспособный использовать кортежи, я решил создать свой собственный генератор ключей и реализовать его шаблон следующим образом:

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();
}

Где FormatTools.LIST_ENTRY_DELIMITER - это Unicode Персонаж для частного использования 0xe04d .

17
задан Iain Fraser 16 February 2012 в 02:22
поделиться