Mam struktury, które można bardzo łatwo przedstawić za pomocą trzech głęboko zagnieżdżone słownika, tak jakCzy głęboko zagnieżdżony słownik jest antypodstawą?
private static Dictionary<string, Dictionary<string, Dictionary<string,string>>> PrerenderedTemplates;
przypadku gdy struktura może być używany coś jak ten
PrerenderedTemplates[instanceID][templategroup][templatepart]
Teraz zdaję sobie sprawę, że Kod ten jest trudny do odczytania, ponieważ patrząc na definicję, nie można stwierdzić, do czego służy. Jedyną zaletą, którą naprawdę widzę w zmianie na Dictionary<string, PrerenderedTemplate>
jest czytelność. Konwersja każdego zagnieżdżenia do własnej klasy (np. class PrerenderedTemplate{} class TemplateGroup{} class TemplatePart{}
) dodawałaby o wiele więcej linii kodu przy niewielkiej (jeśli jakąkolwiek) przewadze obliczeniowej. O ile widzę.
- Tak, czy moje podejście jest "ok", czy powinienem zrobić więcej i stworzyć oddzielne klasy?
- Czy można w prosty sposób opisać, w jaki sposób zagnieżdżona
Dictionary
działa w dokumentacji/komentarzach - Czy istnieje najlepsza praktyka do obsługi tego rodzaju zagnieżdżania?
- Pamiętaj, że jest to prywatny użytkownik, nie musi być prosty dla osób korzystających z klasy.
Aktualizacja
Więc, zainspirowany Rezy, ale nie można używać krotek, postanowiłem stworzyć własny generator klucza i wykonywać swój wzór takiego:
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();
}
Gdzie FormatTools.LIST_ENTRY_DELIMITER
jest znak prywatnego użytku Unicode 0xe04d
.
Ponieważ dwa pierwsze zagnieżdżenia są w zasadzie tylko identyfikatorami, być może uda mi się uciec prostym słownikiem. Więc 'PrerenderedTemplates [" instance1 "] [" fruit "] [" banana "]' może być po prostu reprezentowane jako 'PrerenderedTemplates [" instance1_fruit_banana "]', podobnie jak przestrzeń nazw. –
Czy potrzebujesz możliwości używania 'PrerenderedTemplates' do wyświetlania grup szablonów lub części szablonów? Sortowanie w sposób 'PrerenderedTemplates [instanceID] .Keys' lub' PrerenderedTemplates [instanceID] [templateGroup] '? Jeśli tak, to prawdopodobnie jest to najprostszy sposób, aby sobie z tym poradzić. –
@ M.Babcock, no cóż, zapętlałem kolekcję obiektów zawierających metadane wskazujące, jak renderować szablon. Przed renderowaniem tego szablonu chcę sprawdzić mój słownik, aby upewnić się, że nie został wcześniej wyrenderowany. Jeśli nie, renderuję go i dodaję wynik do mojego słownika. (Zarządzanie zmianą szablonów jest obsługiwane w innym miejscu) –