木構造を構築するアルゴリズムをリファクタリングしましょう。
ウェブフォーラムの中には木構造のレイアウトを使っているところもあり、投稿は木のかたちで表示されます。しかし、そうした投稿はたいてい、データベースに並び順のないレコードの集まりとして保存されています。そのため、投稿をユーザーに表示するときには、木構造を組み立て直す必要があります。
ここでの仕事は、高度に抽象化されたレコードのための木構造構築ロジックを実装した、動いてはいるものの遅くてきたないコードをリファクタリングすることです。レコードには、ID番号と親のID番号しか含まれていません。ID番号は常に0以上、レコードの配列の長さ未満です。ルートのレコードは自分のIDと同じ親IDを持ちますが、それ以外のすべてのレコードは、自分のIDより小さい親IDを持ちます。
木構造の例:
root (ID: 0, parent ID: 0)
|-- child1 (ID: 1, parent ID: 0)
| |-- grandchild1 (ID: 2, parent ID: 1)
| +-- grandchild2 (ID: 4, parent ID: 1)
+-- child2 (ID: 3, parent ID: 0)
| +-- grandchild3 (ID: 6, parent ID: 3)
+-- child3 (ID: 5, parent ID: 0)
ときに、例外を送出する必要があります。その際は、エラーの原因が何であるかを示す意味のあるエラーメッセージを必ず含めるようにしましょう。そうすることでコードが読みやすくなり、デバッグも格段に楽になります。エラーの原因が特定の型であるとわかっている場合は、組み込みのエラータイプのいずれかを送出してもかまいませんが、その場合も意味のあるメッセージを含めるようにしましょう。
この演習では、無効な木の入力に対してValueErrorを「スロー」するために、raise文をどこでどのように使うかをリファクタリングする必要があります。テストが通るのは、コードが適切なexceptionをraiseし、それに適切なメッセージを添えている場合だけです。