Das war's für heute.
Bis zum nächsten Mal.
So, schönen guten Tag, Praxistipps-Referentariat, typische Programmierfehler.
Die Einführung in die Programmierung ist geprägt von möglichst vielen Übungen, wenn man wird
gut, indem man Dinge einfach mal macht und dabei möglichst viele Fehler begeht.
Das wissen Sie vielleicht noch aus eigener Erfahrung, die Programmierung ist voll mit
Stolpersteinen.
Und der Anfänger wird jeden Stolperstein mitnehmen.
Für Sie als Lehrkraft ist es wichtig, dass Sie
vorhersehbare Anfängerfehler, die es gibt, schnell entdecken können und schnell
korrigieren können.
Und auch in der Lage sind, wenn Sie wissen, welche Fehler typisch sind,
diese direkt in den Unterricht einzubauen,
so dass zumindest einige
Fehler
vermieden werden können.
Das Gute ist, dass es eine ganze Reihe von klassischen Anfänger-Fehlern gibt und wenn
sie die kennen, dann können sie sie auch zügig beheben, denn sie müssen sich das in der Praxis
immer vorstellen. Sie haben eine Lerngruppe von 20+ Leuten und alle sind zu Gange mit
der Programmierung und kommen erstmal nicht weiter.
Da haben sie ganz schnell sehr viel zu tun, wenn sie jeden Fehler wirklich
suchen müssen, anstatt mit dem geschulten Auge
das die Erfahrung bringt, einmal drauf zu schauen und dann sofort zu sehen
was falsch ist.
Natürlich werden sich diese Fähigkeiten bei Ihnen nach und nach ausbilden, aber
je mehr man vorher schon weiß, desto entspannter
ist dann
die Praxis für Sie.
Ohne Anspruch auf Vollständigkeit sind hier 7 typische Anfängerfehler aufgeführt und die werden es nach und nach vorgestellt.
Zunächst die Java-spezifische Konvention, dass der Klassenname, hier TestUplet, immer gleich dem Dateinamen sein muss, in dem die jeweilige Klasse gespeichert ist.
Das heißt, achten Sie darauf, dass ...
... im Beispiel "Test-Uplet" auch in der Datei "Test-Uplet" gespeichert ist.
Das ist noch eine relativ leicht zu behebende Sache.
Schwieriger ist dieses Fehlerbild hier, wenn Sie das zum ersten Mal sehen, das ist gar nicht so leicht zu finden.
Und zwar, wenn Sie die Grundstrukturen, also Sequenz, Entscheidung, Wiederholung einführen, kommen Sie dann zur Vorschleife.
Und mit ...
sind mit dem Problem der Zeichensetzung konfrontiert, also Klammern und Semikolons insbesondere.
Und da wird der ein oder andere schonmal auf die Idee kommen, an diese Stelle,
nach den runden Klammern der Vorschleife in Semikolons zu setzen und dann den Rumpf der Schleife zu formulieren.
Es ist syntaktisch korrekt, das ist das Problem dabei.
Allerdings verhält sich das Programm dann nicht so wie ...
... der Schüler das gerne möchte. Und hier ist nochmal aufgefüllt, warum das so ist.
Das Simikolon nach den runden Klammern der Vorschleife entspricht einem leeren Rumpf.
Das heißt, sie könnten das auch in dieser Form schreiben. Das heißt, der Block, der Rumpf ...
... der eigentlich hier in Mengenklammern zur Vorschleife gehörig zählen soll, von der Intention her, wird aufgrund des Semikolons nicht mehr dazugezählt.
Da die Klammerung syntaktisch korrekt ist, gibt es auch keinen Syntaxfehler.
Das heißt, sie haben eigentlich sowas hier geschrieben.
Vorschleife und dann einen leeren Rumpf gefolgt von einem weiteren Rumpf, der hier unnötige Klammern hat, aber die sind ja nicht falsch.
Ganz fieser Fehler.
Das ist günstig, wenn man den vorher mal gesehen hat.
Ein weiterer Klassiker, historisch gewachsen oder historisch zu erklären, ist der Vergleich auf Gleichheit und die Zuweisung.
Sie wissen, dass obiges Konstrukt, also if a = b, eine Zuweisung ist.
Also a und b werden gleich gesetzt.
Intendiert aus der Sicht des Anfängers, und da kommen halt die Probleme her.
Man ist nur einmal Anfänger und dann vergisst man ganz schnell seine Anfänger -Probleme.
Aus der Sicht des Anfängers, der noch nicht in diese
Routinen
der Programmierung
sich hinein entwickelt hat.
Ist das hier zunächst mal die intuitivere Variante eines Vergleichs
auf Gleichheit? Wenn a = b.
Jetzt muss er sich erstmal daran gewöhnen, dass in vielen Programmiersprachen, so auch
in Java, der momentan Unterrichtssprache, beispielsweise in Nordrhein -Westfalen, nun
mal an einzelnes Gleich eine Zuweisung darstellt, während der Vergleich auf Gleichheit per
Doppelgleich erfolgt.
Intuitiv ist das nicht, das werden Sie dann auch sehen, wenn Sie Anfänger in
der Programmierung unterrichten.
Warum wurde das so gemacht? Sie müssen da immer die Historie im Hinterkopf halten.
Als Java entwickelt wurde, war es wichtig, dass gewisse Übergänge von anderen Programmier sprachen,
seitens der Programmierer dann auch möglich waren, möglichst leicht,
und dass eine gewisse Abwärtskompatibilität erhalten bleibt.
Und einer der Vorläufer von Java war C und C++ und da wurde das genauso gemacht.
Nur weil das so gemacht wurde, seit Jahr und Tag, heißt das nicht, dass es sinnvoll ist.
Es ist auf jeden Fall nicht intuitiv.
Das ist einer der Gründe, warum beispielsweise in Pascal, die Niklas Wirt als Lehrsprache ursprünglich entwickelt hat,
genau dieses Problem auch anders gelöst wurde, nämlich das einzelne Gleicherzeichen ist tatsächlich Vergleich auf Gleichheit,
also wie das intuitiv ist für den nicht geschulten Lernenden.
Und Doppelpunktgleich oder das per Definition gleich aus der Mathematik wurde für die Zuweisung verwendet.
Ja, aber gut, es ist so, wie die Sprache das vorgibt. Das heißt, das klassische Fehlerbild Zuweisung und Testaufgleichheit wird gerne auch später immer mal wieder verwechselt.
Und da das syntaktisch in der Regel immer korrekt ist, gibt es dann halt auch keinen Fehler.
Fehlermeldung vom Compiler. Das Programm verhält sich nur nicht so, wie es soll, was ja sehr viel unangenehmer ist, als gibt es direkt einen Syntax -Fehler.
Gut, ein Fehlerbild, das schon etwas fortgeschrittener ist, ist das Problem der Sichtbarkeit.
Wenn Sie sich den Quellcode-Ausschnitt anschauen, dann gibt es manchmal, dass es weniger verbreitet, als man meinen könnte,
dass es weniger verbreitet ist.
Es gibt Probleme, die gleich benannten Variablen von Ihrem Gültigkeitsbereich her einzuschätzen.
Wenn Sie ein "i" haben außerhalb des Rumpfes einer Methode, innerhalb der Klasse, beispielsweise als Attribut,
und das gleichlautende "i" innerhalb einer Methode, dann kommen manchmal Verständnisprobleme auf,
welches "i" ...
nun verwendet wird. Das ist aber erstaunlicherweise weniger häufig zu beobachten, als man das vielleicht von der rein theoretischen Sicht her vermuten könnte.
Denn meisten Lernenden ist das auch irgendwie intuitiv klar, dass wenn innerhalb einer Methode eine Variable verwendet wird, die auch außerhalb der Methode vorrätig ist, dann wird die innerhalb der Methode verwendet.
Sollte das mal ein Problem sein, haben Sie jetzt schon ein geschultes Auge dafür.
Ja, diesen Fehler, den werden Sie wahrscheinlich lieben gelernt haben, aus der eigenen Erfahrung.
Wenn es nach einer gewissen Zeit in der Programmierausbildung um Datenreihen, Datenreiungen geht in Form von arrays,
meistens mit Zahlen drin zunächst, dann
müssen sie da auch durchlaufen mit einer Vorschleife in der Regel
und da gibt es dann verschiedene Fehlerbilder.
Eines davon
ist
die Problematik
der Genauigkeit im Denken
was das Gleich
kleiner, größer, kleiner gleich, größer gleich
angeht.
Da müssen sie
direkt von Anfang an
einen besonderen Wert darauf legen, dass das alle korrekt lernen soll heißen, in der Einführung mit absoluten Zahlen, aber dann ganz schnell sauber programmieren und allgemeine Attribute verwenden, wie zum Beispiel das Attribut length des arrays. Dann haben sie ja diese Probleme gar nicht erst.
Es wird so oder so passieren, dass Leute über die array-Grenzen hinaus wandern und dann einen
array-index out of bounds bekommen.
Je sauberer sie programmieren und die Unterschiede zwischen den Relationszeichen verdeutlichen,
die man einfordern und ziemlich zügig zu den
allgemeinen Programmieransätzen überlängst gehen, desto weniger Probleme wird es da geben.
Und weisen Sie auf diese klassischen Fehler auch immer wieder hin.
"Finde den Fehler"-Übungsaufgaben haben sich in der Praxis als hilfreich erwiesen,
dass sozusagen Sie Quellcode-Ausschnitte als Übungsaufgabe formulieren,
die irgendwelche fiesen Fehler enthalten und die lernen sollen, die dann finden.
Wenn Sie in der Einführung von arrays noch nicht mit dem Length-Attribut arbeiten, sondern tatsächlich mit absoluten Zahlen,
dann müssen Sie bedenken, dass der Novize noch nicht dran gewöhnt ist, dass in der Informatik von 0 an begonnen wird zu zählen.
Wenn man also 10 Elemente in einem Feld hat, da geht man ja von 0 bis 9 durch.
Also von 0 bis 9 ergibt 10 Elemente als Merkhilfe.
Und es hat sich, wie in allen anderen Inhalten auch bewährt, sinnvolle Routinen dabei aufzubauen.
In dem Fall soll das heißen, dass Sie typisch für eine Vorschleife immer bei 0 anfangen.
Und dann die auf kleiner als gewünschte Anzahl prüfen.
Soll heißen, wenn man 10 Elemente abklappern möchte und man fängt bei 0 an und geht bis kleiner als 10, dann hat man ja 0 bis 9 durchlaufen und genau die 10 Elemente erwischt.
Das ist der Standardfall, deckt fast alle Szenarien ab und bietet sich deswegen an als Routine etabliert zu werden.
Was in der fortgeschrittenen Anfängerausbildung ein Problem darstellt, ist, wenn man zu Strukturen
übergeht, die eine Struktur in sich tragen.
Schauen wir uns dazu folgendes Beispiel an.
Wir haben hier ein 2D-Feld, deren Elemente
Felder sind, also Objekte der Klasse Feld hier abgebildet.
Wenn man sich jetzt den Quellcode-Ausschnitt auf der rechten Seite anschaut, dann wird hier ein 2D-Feld
formuliert und über eine doppelt verschachtelte Vorschleife durchlaufen.
Und die interessante
Zeile, die sie sorgfältig und mehrfach in verschiedenen Szenarien dann
steht im Rumpf der zweiten Vorschleife. Testfeld an der Stelle XY gleich Newfeld. Das heißt, an jeder Stelle,
an jedem Kästchen wird ein Objekt gesetzt, vom Datentyp Feld.
Okay.
Was heißt das jetzt von der Denkweise? Und da kommen die Probleme her.
Testfeld an der Stelle 3-4. Was liefert das für einen Datentyp?
Diese Dinge müssen sie dann sehr viel wert legen, sonst sind Fehler nicht mehr
behebbar, weil die Leute nicht wissen, was sie da eigentlich machen. Also dieses
Testfeld an der Stelle 3-4 liefert ein Objekt vom Datentyp Feld und davon die
Methode in dem Fall neuer Status. Das heißt, die
Struktur 2D-Feld hat eine innere Struktur, nämlich die einzelnen Objekte vom
Datentyp "Feld", die wiederum eine innere Struktur haben, nämlich hier ihre
Attribute und Methoden. Da sind sie dann aber schon im fortgeschrittenen Bereich
in der Kursphase, nicht mehr in der Einführungsphase.
Gut, die
Der letzte typische Programmierfehler, der auch schon in den vorgeschrittenen Bereich
fällt, ist der, ist das Konstrukt, wenn Objekt 1 doppelgleich Objekt 2, da vergleicht man
auf Gleichheit.
Das ist so der intuitive Ansatz, wenn das eine Objekt gleich dem anderen ist, dann
erinnert sich der Lernende, ja, Vergleich auf Gleichheit ist ja hier per doppelgleich,
das ist super.
Und erwartet dann, dass da Ja oder Nein als Antwort, also bullshit Antwort herauskommt.
Das funktioniert so nicht, wie Sie wissen, weil damit nicht Objekte verglichen werden,
sondern Adressen.
Da steckt natürlich jetzt eine ganze Menge an notwendiger Theorie dahinter, wie Objekte
eigentlich im Speicher verwaltet werden.
Deswegen ist es auch ein vorschrittener Fehler, der wird Ihnen aber häufig unterkommen.
Und so sind Sie schon mal darauf vorbereitet.
Gut, viel Spaß in der Ausbildung Ihrer Programmierer.