Skip to content

Wie schlaue Datenstrukturen entstehen…

Vor einiger Zeit bin ich über die Erkenntnis (eines anderen) gestolpert, dass Smart data structures and dumb code works a lot better than the other way around.

Außerdem hatte ich von einer Äquivalenz von Daten und Code gelesen: Data is just dumb code and code is just smart data.

Gestern ist mir bei einem Refactoring ein gutes Beispiel für zumindest die erste Aussage unter die tippenden Finger gekommen:

Aufgabenstellung: Im Code soll in eine Datenstruktur nur dann ein neuer Wert eingefügt werden, wenn’s den Wert noch nicht gibt.

Der Ausgangspunkt ist eine auf einer Hashtable basierende Lösung (die Code-Schnipsel sind in C# (2.0)):

foreach (int toNodeID in toNodeIDs)
{
    if (!NoLinkNodeIDs.Contains(toNodeID)) 
      NoLinkNodeIDs.Add(toNodeID);
}

Als ich analogen Code wenige Zeilen später nochmal erblicken durfte, war mir sofort klar, dass ein bisschen Refactoring angesagt und unbedingt notwendig war.

Zunächst: Im Zusammenspiel von Aufgabenstellung und obigem Codeschnipsel sollte klar werden was hier fehlt und getan werden musste: Die Variable NoLinkNodeID sollte von einem Typ sein, der Mengen darstellt (d.h. insbesondere: jeder Wert kommt nur einmal in der Menge vor).

Aber: Eine Set-Implementierung gibt’s in .Net 2.0 in der BCL gar nicht! Ich konnte es kaum glauben: Eine Set-Implementierung kam erst in 3.5 dazu!.

Also habe ich eine eigene Datenstruktur implementiert, die die nötigsten mengenartigen Funktionalitäten zur Verfügung stellt. In dieser Implementierung habe ich zunächst die Einmaligkeitsprüfung in einer Add-Methode umgesetzt:

foreach (int toTabID in toTabIDs)
{
    NoLinkTabIDs.Add(toTabID);
}

Aber, hey, warum hier aufhören? Also habe ich auch den Schleifendurchlauf in meine Mengenklasse “ausgelagert”:

NoLinkTabIDs.AddRange(toTabIDs);

Warum auch sollte Code, der die Datenstruktur verwendet, die Datenstruktur so komplex ansteuern, wie das zu Beginn des Refactorings der Fall war?

Ganz offensichtlich ist das Ergebnis des Refactorings dem Ausgangszustand vorzuziehen – die durch die schlauere Datenstruktur gewonnene Abstraktion schafft u.a. Übersichtlichkeit und einen gewissen deklarativen Touch.

Nebenbei bemerkt ist das Ergebnis sicherlich wesentlich objektorientierter (von wegen Kapselung und so) als das zu Beginn der Fall war.

Smart data structures and dumb code works a lot better than the other way around.

Verwandte Artikel

Post a Comment

Your email is never published nor shared. Required fields are marked *