Hallo zusammen,
momentan entwickle ich einen Parser (hoffe das ist hierfür die richtige Bezeichnung :D) der mir eine bestimmte Zeichenkette einliest und zerlegt. Eine mögliche Zeichenkette wäre Folgende:
+(Rot/Blau/Grün)+Viereckig+(Leicht/Schwer)+Teuer
Rauskommen sollen alle möglichen Kombinationen die dieser Term beinhaltet, also:
Rot, Viereckig, Leicht, Teuer
Blau, Viereckig, Leicht, Teuer
usw...
Die Aufdröselung nach einzelnen Kombinationen funktioniert schon mal einwandfrei. Im nächsten Schritt möchte ich die Ergebnisse aber untereinander vergleichen. Hierfür muss ich mithilfe zugeführter Daten kategorisieren um welchen Typ sich jedes Merkmal handelt damit ich weiß was ich womit vergleich muss, Farbe mit Farbe zum Beispiel. Rot/Blau/Grün sind vom Typ Farbe, Viereckig ist vom Typ Form usw...
Das ist wichtig für mich weil die Vergleichsmechanismen vom jeweiligen Typ abhängig sind und sich nicht verallgemeinern lassen.
Hier mein Ansatz:
Jeder Typ (Farbe, Form, Preis, ...) bekommt eine eigene Klasse spendiert die alle von der Basisklasse "Merkmal" erben. In den jeweiligen Klassen lassen sich sehr bequem die Vergleichsmechanismen realisieren. Das Problem ist jetzt aber der Schritt wie ich überhaupt an ein Objekt des richtigen Typs komme. Zu welchem Typ meine Zeichenkette (z.B. "Blau") gehört lese ich mir aus einer XML-Datei aus:
Obwohl der Ansatz im weiteren Verlauf blendend funktionieren zu scheint so bin ich an dieser Stelle doch noch sehr unzufrieden. Problematisch wird es wenn jetzt weitere Typen hinzukommen was definitiv passieren wird. Ich müsste sowohl Neue Klassen anlegen (Damit könnte ich noch leben) aber auch diese Methode abändern. Auch dass hier nach einem String differenziert wird gefällt mir nicht wirklich. Ich hätte gerne so etwas wie ein Enum dass sich dynamisch erstellt und erweitet und dann jedes mal durchlaufen wird.
Ja die "Fragestellung" hier ist sehr vage aber vielleicht gibt es ja jemanden dem auf Anhieb ein viel besserer Ansatz einfällt. Bin für alles offen.
Vielen Dank fürs lesen und für eventuell folgende Beiträge
Gruß Tommi
momentan entwickle ich einen Parser (hoffe das ist hierfür die richtige Bezeichnung :D) der mir eine bestimmte Zeichenkette einliest und zerlegt. Eine mögliche Zeichenkette wäre Folgende:
+(Rot/Blau/Grün)+Viereckig+(Leicht/Schwer)+Teuer
Rauskommen sollen alle möglichen Kombinationen die dieser Term beinhaltet, also:
Rot, Viereckig, Leicht, Teuer
Blau, Viereckig, Leicht, Teuer
usw...
Die Aufdröselung nach einzelnen Kombinationen funktioniert schon mal einwandfrei. Im nächsten Schritt möchte ich die Ergebnisse aber untereinander vergleichen. Hierfür muss ich mithilfe zugeführter Daten kategorisieren um welchen Typ sich jedes Merkmal handelt damit ich weiß was ich womit vergleich muss, Farbe mit Farbe zum Beispiel. Rot/Blau/Grün sind vom Typ Farbe, Viereckig ist vom Typ Form usw...
Das ist wichtig für mich weil die Vergleichsmechanismen vom jeweiligen Typ abhängig sind und sich nicht verallgemeinern lassen.
Hier mein Ansatz:
Jeder Typ (Farbe, Form, Preis, ...) bekommt eine eigene Klasse spendiert die alle von der Basisklasse "Merkmal" erben. In den jeweiligen Klassen lassen sich sehr bequem die Vergleichsmechanismen realisieren. Das Problem ist jetzt aber der Schritt wie ich überhaupt an ein Objekt des richtigen Typs komme. Zu welchem Typ meine Zeichenkette (z.B. "Blau") gehört lese ich mir aus einer XML-Datei aus:
XML-Quellcode
- <MermalTypen>
- <Typ Name="Farbe">
- <Value>Blau</Value>
- <Value>Rot</Value>
- <Value>Grün</Value>
- </Typ>
- <Typ Name="Form">
- <Value>Viereckig</Value>
- <Value>Rund</Value>
- <Value>Oval</Value>
- </Typ>
- <Typ Name="Preis">
- <Value>Teuer </Value>
- <Value>Billig </Value>
- </Typ>
- <Typ Name="Gewicht">
- <Value>Leicht</Value>
- <Value>Schwer</Value>
- </Typ>
- </MermalTypen>
VB.NET-Quellcode
- Private Sub MerkmaleHinzufuegen(MerkmalWerte As List(Of XElement))
- For Each MerkmalWertXElement As XElement In MerkmalWerte
- Dim MerkmalWertTyp As String = MerkmalWertXElement.@Name
- Dim NeuesMerkmal As Merkmal
- Select Case MerkmalWert
- Case "Farbe"
- NeuesMerkmal = New Farbe()
- Case "Form"
- NeuesMerkmal = New Form()
- Case "Preis"
- NeuesMerkmal = New Preis()
- Case "Gewicht"
- NeuesMerkmal = New Gewicht()
- Case Else
- Throw New ArgumentException(MerkmalWert & " ist nicht im Merkmalsvorrat vorhanden", "MerkmalWerte")
- End Select
- '...
- End Sub
Obwohl der Ansatz im weiteren Verlauf blendend funktionieren zu scheint so bin ich an dieser Stelle doch noch sehr unzufrieden. Problematisch wird es wenn jetzt weitere Typen hinzukommen was definitiv passieren wird. Ich müsste sowohl Neue Klassen anlegen (Damit könnte ich noch leben) aber auch diese Methode abändern. Auch dass hier nach einem String differenziert wird gefällt mir nicht wirklich. Ich hätte gerne so etwas wie ein Enum dass sich dynamisch erstellt und erweitet und dann jedes mal durchlaufen wird.
Ja die "Fragestellung" hier ist sehr vage aber vielleicht gibt es ja jemanden dem auf Anhieb ein viel besserer Ansatz einfällt. Bin für alles offen.
Vielen Dank fürs lesen und für eventuell folgende Beiträge
Gruß Tommi