Sagen wir, ich habe eine solche Struktur
%Vor% Also enthält die Klasse Form
die Liste der Felder, sagen wir, dass das Feld selbst mit einer solchen Struktur dargestellt wird
Die Field
ist im Grunde eine zusammengesetzte Struktur, jede Field
enthält die Liste der untergeordneten Felder. Die Struktur ist also hierarchisch. Auch Field verweist auf die Klasse FieldType
.
Und am Ende haben wir einen Verweis auf DataType
Was ich erreichen möchte ist, den Unterschied einer solch komplexen Struktur zu bekommen, sagen wir, wenn ich irgendeine Art von Comparer habe, wird es mir einen strukturierten Unterschied für die ganze Form als eine Klasse geben, sagen wir DifferenceResult. Wenn ich strukturierten Unterschied sage, meine ich, dass es so etwas sein sollte.
Form
(Ausgabe Form
hat Unterschiede im Feld Version (andere Farbe) Fields
-Sammlung, einschließlich der Hierarchie der Felder zum bearbeiteten Feld FieldType
und DataType
Field
in Form
hinzu (wahrscheinlich wird jeder Unterschied einen Typ haben) Was ich gerade habe. Ich habe mit dem generischen Ansatz begonnen und versucht, ReflectionComparer zu verwenden, das die IEqualityComparer-Schnittstelle implementiert.
%Vor% Und Difference
class
Aber wahrscheinlich ist es nicht die Art, wie ich gehen möchte, weil ich Feld genauer vergleichen sollte unter Berücksichtigung, dass jedes Feld ID hat, die für verschiedene Formen auch unterschiedlich sein kann, und ich möchte mehr Kontrolle über den Vergleichsprozess nehmen . Für mich klingt es eher wie ein Diff-Tool.
Ich suche also nach einem guten Muster und einer ziemlich guten Struktur, um den Unterschied zum Client-Code zu veröffentlichen, der es leicht visualisieren kann?
Nachdem ich ein Bit untersucht und verschiedene Ressourcen verglichen habe, habe ich einen solchen Algorithmus implementiert.
Später werde ich meinen Code veröffentlichen und die Antwort aktualisieren.
Da Ihre Klassen bereits sehr bekannt sind, würde ich folgende Dinge verwenden:
Eine IDiffable-Schnittstelle, die eine Klasse mit einer DiffWith (T other) -Klasse erzeugt und eine Aufzählung von Unterschieden zurückgibt. Es macht dann Sinn, einfach Ihren DiffWith in jeder Ihrer Klassen zu implementieren, was trivial sein sollte, da sie ziemlich fest sind.
Eine separate ReflectionDiff-Klasse (möglicherweise statisch), die wie Reflektoren mit der Reflektion verglichen wird. Dieser könnte Attribute verwenden, um beliebige Eigenschaften / Felder aufzulisten / zu ignorieren. Auf diese Weise können Sie eine Standard-Diff-Engine für die schnelle Implementierung von Unterschieden verwenden und genau den von Ihnen verwendeten Reflektionscode verwenden. Sie könnten einfach eine Implementierung von diff mit wie:
haben %Vor%Sie erhalten eine einzige Klasse mit dem ganzen schmutzigen Reflexionscode (der nicht wirklich benötigt wird) und können eine einfache Implementierung von DiffWith in jeder Ihrer diffablen Klassen haben.
Nicht sicher, wie elegant Sie eine Lösung suchen, aber wenn Sie nur eine ziemlich schnelle Lösung mit minimalem Code wollten, dann vielleicht:
Wie ich schon sagte, ist dies eine schnelle Lösung, aber vielleicht gut genug für Ihre Bedürfnisse. Ansonsten sind Befehlszeilen-Diff-Tools verfügbar, die eine Unix-Stil-Diff-Datei ausgeben, für die Sie dann Ihren eigenen Visualizer schreiben könnten.
Tags und Links algorithm c# design-patterns comparison data-structures