Repräsentation der hierarchischen Aufzählung

8

Ich habe eine Reihe von Aufzählungswerten (genauer gesagt, Fehlercodes). Der Code ist eine 16-Bit-Ganzzahl ohne Vorzeichen. Ich suche nach einer Datenstruktur, die eine solche Aufzählung darstellen könnte. Eine ähnliche Frage wurde hier gestellt: Was ist das beste C # -Muster für die Implementierung einer Hierarchie mit einer Enumeration? . Aber diese Hierarchie ist tiefer.


Beispielaufzählungswerte

%Vor%


Anwendungsfall
Wenn der Benutzer einen Code bereitstellt, muss die Benutzeroberfläche die entsprechende Bedeutung des Codes mit der Hierarchie anzeigen.
Wenn der Benutzer beispielsweise den Wert 0x2121 angibt, muss die Benutzeroberfläche Short to earth in phase 1 in the current at device input side anzeigen. Der beste Weg, dies darzustellen, ist eine hierarchische Notation: Current : DeviceInputSide : ShortToEarth : ShortToEarthInPhase1 .


Konkurrierende Ansätze
Ich habe drei konkurrierende Ansätze, um die Aufzählung darzustellen:

  1. Erstellen Sie eine Aufzählung auf jeder Ebene der Hierarchie. Verwenden Sie dann eine Controller-Klasse, um den Namen aufzulösen.
  2. Speichern Sie die Enumerationswerte in einem XML-Code und verwenden Sie LINQ, um die Bedeutung des Codes zu generieren.
  3. Speichern Sie die Enumerationswerte in einem XML-Code. Während des Starts der Anwendung. Erstellen Sie eine Singleton-Instanz, um die Bedeutung abzurufen. Die Instanz enthält ein Wörterbuch, in dem die Werte aus dem XML-Code enthalten sind.


Ansatz 1
Die Aufzählungen:

%Vor%

Der Controller:

%Vor%


Ansatz 2
Das XML zum Speichern der Aufzählungswerte sieht folgendermaßen aus

%Vor% Und die Methode, um die Codes abzufragen ist: %Vor%


Ansatz 3
Das XML zum Speichern der Enumerationswerte ist das gleiche wie in Approach 2. Das Wörterbuch wird von xml by GetChildren() ausgefüllt.

%Vor%

Die Bedeutungen werden mit GetHierarchicalMeaning() :

abgerufen %Vor%

Die Klasse WarnCodeValue :

%Vor%


Fragen

  1. Welcher der drei oben genannten Ansätze ist vom Standpunkt der Leistung besser?
  2. Gibt es andere Ansätze für die Darstellung der Aufzählung?
  3. Verbesserungen am Code?
Devendra D. Chavan 18.02.2011, 12:18
quelle

4 Antworten

0

Gefunden, dass eine modifizierte Version von Ansatz 3 am besten geeignet ist. Danke an @paolo , dass er mir geholfen hat, die Antwort zu finden.

Modifizierter Ansatz 3

Das xml enthält die Codes:

%Vor%


Die Klasse WarnCodeValue :

%Vor%


Die Prozessorklasse singleton (um die Bedeutung eines Codes abzurufen):

%Vor%


Verwendung

%Vor%


Ausgabe
Current : Current, Device Input side : Short to Earth : Short to earth in Phase L1


Mögliche Modifikationen enthalten GetMeaning(code) , um die ursprüngliche Bedeutung des Codes und nicht die verkettete Bedeutung zu erhalten.

    
Devendra D. Chavan 21.02.2011, 17:56
quelle
4

Wenn Sie Klassen anstelle von enums verwenden, verwenden Sie für jeden Wert einen Singleton und können mit dem Typsystem eine Struktur erstellen, einschließlich virtueller Methoden, um Fehler txt usw. zu erzeugen. (Dies kann manchmal eine gute Option , kann aber auch zu vielen Problemen führen, wenn es nicht gut passt)

    
Ian Ringrose 18.02.2011 16:36
quelle
1

Sie können FlagsAttribute verwenden. Zum Beispiel könnten Sie so etwas tun:

%Vor%

Sie können es so testen:

%Vor%     
Paolo Falabella 18.02.2011 12:42
quelle
1

Zweiter Versuch ... Sie könnten Ihre eigene Baumstruktur implementieren, wobei jeder Knoten eine einstellige hexadezimale Darstellung hat und ein Code wie 0x2121 eine Verzweigung des Baumes darstellt:

%Vor%

Also, um zu lesen, was 0x2121 bedeutet, folgen wir dem entsprechenden Zweig des Baumes und (für jeden Knoten) lesen wir die Nachricht, die es enthält.

Hier ist eine schnelle und schmutzige Implementierung des Baumes:

%Vor%

Sie können den Baum auf diese Weise füllen:

%Vor%

Auf diese Weise erhalten Sie vollständige Kontrolle über die hierarchische Struktur Ihrer Codes und können Prüfungen implementieren, so dass die Struktur selbst nicht beschädigt werden kann. Das Durchsuchen einer Nachricht bleibt einfach und (da ein Code nach der ersten 0 nicht verarbeitet wird) sollte eine Suche nach 0x2000 effizienter sein, da nur die 2 tatsächlich verarbeitet wird.

%Vor%     
Paolo Falabella 19.02.2011 22:59
quelle

Tags und Links