Sprachdesign

Letzte Änderung am 23. August 2021 by Christoph Jüngling

Ihr kennt sicher auch Befehle, bei denen ihr euch auf den Tod nicht merken könnt, in welcher Reihenfolge die Parameter geschrieben werden müssen, oder? Was sagt ihr? Dafür gibt es Intellisense? Ja, richtig, eigentlich. Aber was ist, wenn euch auch Intellisense nicht weiter bringt?

Meine Nemesis ist definitiv die Funktion Instr(). Mit dem ersten und dem letzten Parameter habe ich keine Schwierigkeiten, “wo geht’s los” und “wie wird geprüft” ergibt sich ja auch noch sehr einfach aus der sprechenden Benennung der Parameter. Aber wie war das nochmal im Mittelteil?

Grundsätzlich ist klar, es soll geprüft werden, ob ein String in einem anderen enthalten ist. Doch wie ist das nun gemeint? Wird der erste im zweiten, oder der zweite im ersten gesucht? Und gerade da lässt uns Intellisense leider im Regen stehen:

Falscher Aufruf der Instr()-Funktion in der Programmzeile

Falscher Aufruf der Instr-Funktion

Auch die Online-Hilfe von Microsoft hilft uns im ersten Moment nicht weiter. Erst nach dem Lesen der zusätzlichen Beschreibungen dort wird klar: String1 ist der durchsuchte, String2 der gesuchte String. Ihr könnt euch vorstellen, dass ich es oft genug erstmal falsch mache und erst beim Debuggen dann darauf stoße, dass es anders herum besser ist.

So auch das obige Beispiel. Anstatt den neuen Wert in der Zeichenfolge “R|RW|W” zu suchen, wie man es normal-sprachlich vermuten würde (“Suche NewValue in R|RW|R”), sucht die Instr-Funktion eben diese Aufstellung in dem neuen (eingegebenen) Wert. Das wird mit hoher Wahrscheinlichkeit nicht funktionieren. Wohl dem, der ein paar Testroutinen vorbereitet hat – nicht für die Instr-Funktion, sondern für die Funktion oder Klasse, die diese Funktion enthält.

Andersherum wird also ein Schuh draus:

Richtiger Aufruf der Instr()-Funktion in der Programmzeile

Nun funktioniert der Aufruf der Instr()-Funktion richtig

Bezüglich der Lesbarkeit des Programmcodes wird ja immer empfohlen, doch bitte benannte Parameter zu verwenden. Leider würde das in diesem Fall auch nichts nützen, denn da würde ja auch nur String1:="R|RW|W" und String2:=NewValue stehen.

Auch könnte man jetzt noch zwei Stringvariablen mit beispielsweise den Namen “gesucht” und “durchsucht” anlegen, ihnen den betreffenden Wert zuweisen und dann Instr damit aufrufen. Aber irgendwie erscheint mir das zu viel des Guten, kurzer Code hat ja durchaus auch seinen Reiz.

Leider können wir hier nicht viel machen. Ich will dies aber zum Anlass nehmen, dass wir über die Parameter und Properties in unseren eigenen Funktionen und Klassen ruhig ein bisschen länger nachdenken sollten. Denn nicht alles wirkt in einem anderen Kopf so klar, wie es uns selbst im Moment erscheint.

Ähnliche Artikel:

Schreibe einen Kommentar

Deine Email-Adresse wird nicht veröffentlicht.

drei × vier =