moveRing() --その1--リングを移動するメソッドmoveRing()を考えます。
moveRing()ではどの塔からどの塔へ移動するか解ればリングを移動することができるので、シグニチャは
moveRing(int from, int to)
になります。
実際にリングを移動するにはtower[from]の一番上のリングを取って、tower[to]の一番上にのせれば良いので
tower[to].push(tower[from].pop());
で実現できます。
単純に考えるとこれでメソッド完成ですが、そうはいきません。
「ハノイの塔」のルールから
場合は何もせず、そのような操作はできないことをメソッドの呼び出し元に知らせたいです。
特に最初のケース「リングがつまれていない塔からリングを取りだそうとした」ではtower[from].pop()を実行した時点でjava.util.EmptyStackExceptionが投げられてしまいます。
ルールに反する移動が指定された場合に、それを知らせる方法を考えましょう。
まず最初に考えられるのは
moveRing(int from, int to)がboolean型の値を返すことにし、移動が上手くいった場合はtrueを、上手くいかなかった場合はfalseを返す。
というものです。
ただ、これでは上手くいかなかったことだけはわかりますが、上記三つのどの理由で上手くいかなかったかはわかりません。
そこで
moveRing(int from, int to)がint型の値を返すことにし、上手くいった場合は正の値を、上手くいかなかった場合は不の値を理由に応じて-1、-2、-3と返す。
というのを考えました。これだと上手くいきそうです。
ただ、このメソッドを呼び出した側で値に応じて処理をしなくてはならないので、あまり美しくありません。
「どうしようかなー」と思いながら「Java言語入門」を読んでいたところ、第17章例外処理に「こんな場合は例外を投げなさい」という旨のことが書かれていました。
そこで例外のクラスIllegalMovementExceptionを作成して、ルールに反する移動が指定された場合はそのインスタンスを投げることにしました。