# 課題レポート6: コード読解

## 課題概要
- 迷路生成プログラム <a href="../assets/samples/generate_maze.py" target="_blank">generate_maze.py</a> を読んでみよう。
  - まずは上記ファイル（generate_maze.py）を作業ディレクトリにダウンロードせよ。
  - curlコマンドを使う場合
  ```shell
  curl -O https://ie.u-ryukyu.ac.jp/~tnal/2023/prog1/static/samples/generate_maze.py
  ```
- 達成目標
  - 他人が書いたコードを読んでみよう。
    - 実行するなという意味ではありません。むしろ積極的に実行やデバッグ実行も交えて読み解いてください。関数単位での実行や、関数の中身を部分的に切り出して実行してみるなど、「良くわからない部分があった場合、その処理の流れや処理対象の中身をどうやれば確認できるか」を考えつつ、試してみよう。
    - 210行程ですが、大半はコメント行(docstring)とユニットテスト(doctest)です。実質的なコードは90行程度。
  - 変数名、関数名、コメントの大切さに気付こう。
    - 実装対象（迷路生成）において表現する必要がある状態、例えば「迷路の壁や通路」をどのように表現しようとしているのかを読み取ろう。
    - 実行方法の違いに伴う結果の差異を理解しよう。
  - docstringによるコメントの書き方の参考にしよう。
    - ファイル全体のコメント、関数のコメントをどのように書いてるだろうか？

---
## 取り組み方
- ペアや友人らと話し合って取り組んで構わないが、**自分自身の言葉で述べること。試して分かったこと、自身で解決できなかった部分等についてどう取り組んだか、といった過程がわかるように示すこと**。（考えを図表や文章を駆使して表現して報告する練習です）

---
## 課題詳細
以下に示す4点について取り組み、レポートとしてまとめよ。なお、5番目の課題は余裕がある人向けのオマケ課題です。やってみたい人はどうぞ。

---
### レベル1: docstringドキュメントの外観
- docstringで記述されたドキュメントを help() もしくは pydoc により読み、「スクリプトファイルのどの部分が、help/pydocにおいてどのように出力されているか」について気づいた点について報告せよ。
- ここではドキュメントの内容は詳細に読む必要はない。docstringの機能について気づいた点を報告してください（数行程度でok）。

---
### レベル2: doctestの実行
- doctestで記述されたユニットテストを実行し、テスト結果を報告せよ。レポートには以下の項目を報告すること。
  - (1)実行されたテスト数。
  - (2)テストが成功した数。
  - (3)テストが失敗した数。
  - (4)テストが失敗した関数名。（複数ある場合には複数列挙すること）

---
### レベル3: ドキュメント詳細読み
- コードやdocstringドキュメントを読み、def宣言されている全関数（6個）の機能について概説（数行程度でOK）せよ。また、コードやドキュメントで気になる部分があれば、その部分について言及せよ。
- 補足
  - 読んで理解することが趣旨ですが、実行するなという意味ではありません。積極的に実行やデバッグ実行も交えて読み解いてください。関数単位での実行や、関数の中身を部分的に切り出して実行してみるなど、動作確認方法を考えつつ試してみよう。

---
### レベル4: テスト失敗箇所の要因分析＋コード修正
- テストコードと実コードとを見比べ、テストが失敗している原因を分析せよ。その分析結果を元にテストが通るように実コードを修正せよ。なお、**doctestは正しいものとする（doctestを修正してはならない）**。
- レポートには少なくとも、(1)テストが失敗している原因、(2)コードの修正箇所、の2点について報告すること。また、(2)については下記の手順で報告すること。
  - (2)の修正箇所を報告する手順。
    - Step 1: 修正を始める前に、オリジナルのファイルを「orig.py」というファイル名で複製して残す。（もし既に修正してしまったのであれば、もう一度オリジナルのファイルをダウンロードし直そう。上書きされないように注意）
    - Step 2: 「generate_maze.py」を編集してテストが通るように修正する。
    - Step 3: テストが通ったら、シェル上で「diff orig.py generate_maze.py」を実行せよ。この結果をレポートに掲載すること。（diffコマンドは2つのファイルの差分を確認するためのコマンドです）

```{hint}
- 迷路生成の全体像はドキュメント上部で確認できます。
- 205行までは関数定義のみ。ファイル実行した場合に実行されるコードは207行目以降。207行目以降のコードで、何がどのように処理されていくのかをデバッグ実行しながら確認してみよう。print関数を追加するのも手です。
- レベル2のテストでは create_maze関数、print_maze関数が失敗したはずだ。しかしこれらのコードは正しいものと考えて良い。言い換えるとこれら以外の関数にバグがあり、その影響で別の関数のテストが失敗している。
```

---
### オプション1: テスト失敗箇所の要因分析＋コード修正
レベル4を通して「他の関数が原因でテストが失敗する」ことを確認できたはずだ。別の言い方をすると、「該当する関数のテストが不十分だった」と言えるだろう。このことを踏まえ、どのようなテストを用意すると良いのか検討してみよう。アイデアだけでも良いし、具体的なdoctestの作成＆実行でも良い。

---
### オプション2: アルゴリズムの改善
- 現時点でのコードには、まだブロックのままの箇所があまりにも多い。なんとかして「より迷路を広げる工夫」を考えられないだろうか。
- （今回の課題を無視して）他の迷路生成プログラムを実装してみよう。

---
## <a name="upload">提出方法</a>
- 提出物は「レポート」、「修正済みスクリプトファイル」の2点である。
  - もしそれ以外に作成したものがあるなら、それも提出しよう。
- レポートは電子ファイルで提出するものとする。
- 提出先＆〆切: 授業ページを参照。
