Kleine Plauderei aus dem beruflichen Nähkästchen eines leicht gefrusteten Coders. Normale Menschen klicken bitte weiter, hier gibt es nichts zu sehen.
In meiner Tätigkeit als Codemonkey kommen mir ja immer wieder befremdliche Dinge unter, die irgendwelche anderen Codeäffchen zusammengetippselt haben. Und manchmal reicht ein einzelner Facepalm nicht mehr aus, da der fail einfach zu epic ist. So auch heute, als ich über folgendes Lehrbuchbeispiel für Security by Obscurity gestoßen bin:
Aufgabenstellung: Der Anwender soll ein paar Daten in eine Tabelle klopfen, aus diesen Daten werden dann über einen Template-Mechanismus XML-Dateien erzeugt. Echt kein Hexenwerk. So sieht das aus:
Nun müssen also die eingebenen Daten irgendwie weiter gereicht werden, um von einer anderen Klasse verarbeitet zu werden.
Der Typ, der hier am Werk war, hat sich jetzt Dictionaries zusammengebaut, mit dem Attributnamen als Key. Soweit gehe ich d'accord. Anstatt nun aber ganz simpel die Werte als Strings abzulegen, hat der Typ Windows.System.Form.Textboxes
genommen!! WTF? Und nicht genug damit! Nein, nein. Erst sammelt er sich nämlich die "Invarianten" und die "Varianten" Daten in 2 unterschiedlichen Dictionaries, nur um die dann mitten im Aufruf der verarbeitenden Methode zu einem einzigen Dictionary zusammen zu mergen. Das gibt dann sowas:
count = KLASSE.Do(actionName,
new Dictionary().Union(variantDataGridLinkedBox).ToDictionary(pair => pair.Key, pair => pair.Value).Union(invariantDataGridLinkedBox).ToDictionary(pair => pair.Key, pair => pair.Value));
Hö hö... höhöhö.... mwahahhaa... WAAAHAHAAAAA
Geht's bitte noch umständlicher? Klar! Er initialisiert sich nämlich diese Dictionaries vorher auch noch super hirnverbrannt mit diversen Loops, in denen er dann erstmal leere Textboxen erzeugt(!) um nachher was zu haben, wo er seine Daten dann reinschreiben kann! AUA!!!
Ich also alles rausgeworfen inklusive Initialisierungsfunktionen. Die Daten werden jetzt just-in-time eingesammelt, in ein einfaches Dictionary aus Strings gesteckt und der gleiche Aufruf sieht nachher so aus:
count = KLASSE.Do(actionName,dataToWrite);
ja, zugegeben, das sieht nicht so sophisticated aus. Aber ich kann danach wenigstens wieder ohne Knoten im Hirn ins Bett gehen.