ID-basierte Verwaltung in eigenen Klassen einbauen

    • VB.NET

      ID-basierte Verwaltung in eigenen Klassen einbauen

      Hallo Forum,

      Ich möchte euch mal eine Methode vorstellen, wie man folgendes Problem lösen kann:

      Problemstellung
      Wir stellen ein Klasse bereit, die viele Objekte des selben Typs in einer Liste verwaltet, der User erstellt

      1 2 3 4 5

      Sodass die Liste auch diesen inhalt hat.
      Elemnt 4 hat den Index 3, nachdem es erstellt wurde.
      Nun möchte unser User aber Element 3 loswerden, welches den Index 2 hat.

      1 2 4 5

      Elemnt 4 hat nun Index 2.
      Will der User Elment 4 nun mit seinem alten Index löschen (3), dann wird aber Elemnt 5 gelöscht.


      Die Lösung benutzt IDs, die den Elemten zugeornet sind und sich im gesamten Lifecycle des Elemnts nicht verändern.
      Dazu der Anfang:

      VB.NET-Quellcode

      1. Dim Elemente As List(Of Test)
      2. Dim ElementIDs As List(Of Integer)


      ElementIDs hält dann die ID-Zuordnungen fest.
      Je nach Datenmege könnte man die IDs auch vom Typ Long oder Short oder Byte machen, wir nehmen aber Integer.

      Wenn wir jetzt ein Elemnt erstellen (Create), dann vergeben wir eine ID und geben diese direkt zurück:

      VB.NET-Quellcode

      1. Public Function Create(TestProp1 As String, TestProp2 As String) As Integer
      2. Dim res As Test
      3. Dim resID As Integer
      4. 'Element erzeugen
      5. res.Prop1 = TestProp1
      6. res.Prop2 = TestProp2
      7. 'ID erzeugen
      8. resID = GetNextID()
      9. 'Fertigstellen
      10. Elemente.Add(res)
      11. ElementIDs.Add(resID)
      12. Return resID
      13. End Function


      GetNextID() muss nun also eine einzigartige ID generieren. Das ist recht einfach:

      VB.NET-Quellcode

      1. Private Function GetNextID() As Integer
      2. Dim res As Integer = 0
      3. Do While ElemntIDs.Contains(res)
      4. res += 1
      5. Loop
      6. Return res
      7. End Function


      Und nun zum löschen:

      VB.NET-Quellcode

      1. Public Sub Remove(ID As Integer)
      2. Dim idx As Integer = ElementIDs.IndexOf(ID)
      3. Elemente.RemoveAt(idx)
      4. ElementIDs.RemoveAt(idx)
      5. End Sub


      Das ganze ist hier ohne Error-Handling und somit recht heikel.
      Mögliche Fehler:

      1. Keine IDs mehr vorhanden (> 2^31 Elemente und trotzdem noch Arbeitsspeicher 8| ) -> OverFlowException in GetNextID(), da While zu endlosschleife mutiert
      2. ID existiert nicht (mehr) -> IndexOutOfRangeException in Remove, da idx = -1


      Im Programm muss man dann nurnoch irgendwo sich die IDs "merken"

      Bei Fragen antworte ich gerne, solange sie an der richtigen Stelle gefragt werden.