move beeper wie move es ist, neue Methoden zu definieren, ist es nützlich, dass Karel von einem Ort zum anderen etwas Praktischeres move als move beeper . Die Straßen scheinen oft reparaturbedürftig zu sein, und es könnte Spaß machen zu sehen, ob Karel Schlaglöcher in seiner abstrakten Welt füllen kann. Stellen Sie sich zum Beispiel vor, Karel stehe auf der in der linken Abbildung gezeigten „Straße“, eine Ecke links von einem Schlagloch in der Straße. Karels Aufgabe ist es, das Loch mit einem beeper zu füllen und zur nächsten Ecke zu gelangen. Das Diagramm rechts zeigt, wie die Welt nach der Programmausführung aussehen soll.
Wenn Sie auf die vier vordefinierten Befehle beschränkt sind, run die run Methode zur Lösung dieses Problems folgendermaßen aus:
private void run() {
move();
turnLeft();
turnLeft();
turnLeft();
move();
putBeeper();
turnLeft();
turnLeft();
move();
turnLeft();
turnLeft();
turnLeft();
move();
}
Die ursprüngliche Motivation für die Definition der biegenSieRechtsAb-Methode war, dass es umständlich war, drei biegenSieLinksAb-Befehle wiederholt auszuführen, um eine Rechtskurve zu erreichen. Das Definieren neuer Methoden hat einen anderen wichtigen Zweck, als zu vermeiden, dass Sie dieselben Befehlsfolgen jedes Mal wiederholen, wenn Sie eine bestimmte Aufgabe ausführen möchten. Die Fähigkeit, Methoden zu definieren, eröffnet die wichtigste Strategie in der Programmierung - das Aufteilen eines großen Problems in kleinere Teile, die leichter zu lösen sind. Der Vorgang des Zerlegens eines Programms in kleinere Teile wird Zerlegung genannt, und die Bestandteile eines großen Problems werden Unterprobleme genannt.
Beispielsweise kann das Problem des Füllens des Lochs in der Fahrbahn in die folgenden Unterprobleme unterteilt werden:
Wenn Sie auf diese Weise über das Problem nachdenken, können Sie mithilfe von Methodendefinitionen ein Programm erstellen, das Ihre Vorstellung von der Programmstruktur widerspiegelt. Die run Methode würde folgendermaßen aussehen:
private void run() {
move();
schlaglochFüllen();
move();
}
Die Übereinstimmung mit der Gliederung ist sofort klar, und alles wäre großartig, wenn Sie nur Karel dazu bringen könnten, zu verstehen, was Sie mit schlaglochFüllen meinen. Aufgrund der Fähigkeit, Methoden zu definieren, ist die Implementierung von schlaglochFüllen äußerst einfach. Alles was Sie tun müssen, ist eine schlaglochFüllen-Methode zu definieren, deren Hauptteil aus den Befehlen besteht, die Sie bereits geschrieben haben, um die Aufgabe zu erledigen:
private void schlaglochFüllen() {
turnRight();
move();
putBeeper();
turnAround();
move();
turnRight();
}
Hier ist das komplette Programm. Beachten Sie, wie Sie die Absicht des Programmierers einfach durch Lesen der run Methode verstehen können. Wenn Sie das Programm run ausführen, zeigt die hervorgehobene Zeile Schritt für Schritt, wie es von einem Computer ausgeführt wird. Da das Programm jedoch gut aufgeschlüsselt ist, können wir es auf menschlicher Ebene verstehen: