メソッド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が投げられてしまいます。

------------------------------------

ルールに反する移動が指定された場合に、それを知らせる方法を考えましょう。

まず最初に考えられるのは

というものです。

ただ、これでは上手くいかなかったことだけはわかりますが、上記三つのどの理由で上手くいかなかったかはわかりません。

------------------------------------

そこで

というのを考えました。これだと上手くいきそうです。

ただ、このメソッドを呼び出した側で値に応じて処理をしなくてはならないので、あまり美しくありません

------------------------------------

「どうしようかなー」と思いながら「Java言語入門」を読んでいたところ、第17章例外処理に「こんな場合は例外を投げなさい」という旨のことが書かれていました。

そこで例外のクラスIllegalMovementExceptionを作成して、ルールに反する移動が指定された場合はそのインスタンスを投げることにしました。

------------------------------------

前の項目へ次の項目へ

「メイキング・オブ・ハノイの塔」のページへ