新しいメソッドを定義することができることに付属している電源の多くを説明する方法として、カレルがより少しより実用的な何かを持っていると便利ですmove beeperある場所から別の場所へ。道路はしばしば修理を必要としているように見えます、そして、Karelがその抽象的な世界でくぼみを埋めることができるかどうか見るのは楽しいかもしれません。たとえば、カレルが左側の図に示されている「道路」の上に立っていると想像してください。道路の穴の左側に1つの角があります。カレルの仕事はbeeper穴を埋めて次のコーナーに進むことです。右側の図は、プログラムの実行後に世界がどのように見えるべきかを示しています。
4つの定義済みコマンドに限定されている場合、この問題を解決するためのrun方法はrunようになります。
private void run() {
move();
turnLeft();
turnLeft();
turnLeft();
move();
putBeeper();
turnLeft();
turnLeft();
move();
turnLeft();
turnLeft();
turnLeft();
move();
}
turnRightメソッドを定義するための最初の動機は、正しいターンを達成するために3つのturnLeftコマンドを繰り返し続けることが面倒だったことです。新しいメソッドを定義することには、特定のタスクを実行したいときに毎回同じコマンドシーケンスを繰り返さないようにすること以外に、もう1つ重要な目的があります。メソッドを定義する能力は、プログラミングにおける最も重要な戦略、つまり大きな問題を解決しやすい小さな部分に分割するプロセスのロックを解除します。プログラムを細かく分割するプロセスは分解と呼ばれ、大きな問題の構成部分はサブ問題と呼ばれます。
一例として、道路の穴を埋める問題は、以下の副問題に分解することができる。
このようにして問題について考えるのであれば、メソッド定義を使用して、プログラム構造の概念を反映したプログラムを作成できます。 runメソッドは次のようになります。
private void run() {
move();
穴を埋める();
move();
}
アウトラインとの対応はすぐに明らかになります。穴を埋めることによって、自分だけの意味をKarelに理解させることができれば、すべてが素晴らしいものになります。メソッドを定義する力を考えると、穴を埋めることは非常に簡単です。あなたがしなければならないのは、ボディをその仕事をするためにあなたがすでに書いたコマンドから成る穴を埋めるメソッドを定義することです:
private void 穴を埋める() {
turnRight();
move();
putBeeper();
turnAround();
move();
turnRight();
}
これが完全なプログラムです。 runメソッドを読むだけでプログラマの意図を理解できることに注目してください。あなたの場合はrunプログラムは、ラインのハイライトは、コンピュータが、ステップバイステップでそれを実行する方法を示しています。しかし、プログラムはうまく分割されているので、人間の思考レベルで理解することができます。