step11 課題レポート:「電話帳データベース」【前編】

『山之口洋の極・楽 python 講座 【基礎編】』の卒業課題として、実用的な電話帳ツールを作ってみよう。実用的と呼べる条件は、処理データがプログラム中にハードコーディングされていないとか、処理内容に汎用性があるとかいろいろあるが、ツールの作業結果がプログラム終了後も保存され、次回の作業に引き継げるというのも、その1つだろう。このようなデータ性質を永続性(persistency)という。これに対し、これまでのプログラムで扱ってきたデータは、すべて一時的(temporaly)である。アプリ終了とともに消えるからだ。
データに永続性を持たせる手段はいくつかある。

  1. データベース管理システム(DBMS)を用いてデータベースに格納し、API(Application Program Interface)経由でアクセスする。
  2. 自前でファイル形式を定義し、アプリの開始時と終了時にロード/セーブする。
  3. pythonではその中間的形態として、pickleを使う方法がある。step12で簡単に解説した。また、教科書の「8.2.9 pickleによるシリアライズ」(240ページ)を参照のこと。
現在のPCは、電源を切ればメインメモリの記憶はすべて失われるので、永続的記憶といっても、最終的には補助記憶装置上のファイルに保存する。だって、他のどこに記憶するのだ。この課題では、2か3を奨めるが、腕に覚えのある人は1に挑戦してもよい。pythonにはsqlite3という、便利なリレーショナル・データベース管理システム(DBMS)が標準で含まれているからだ。

プログラムの要求仕様

この「電話帳データベース」は、友人や知人の名前と電話番号を対にして記録し、検索要求に応じて表示する。プログラムはコマンドラインから起動するが、登録した電話帳データはプログラム終了後も永続的に保存される。これが実現できれば、電話番号以外の、たとえば住所録に発展させてもよいし、文字列を検索キーとするさまざまな用途に使えるはずだ。ディクショナリの値には何を入れてもよいからである。

仕様の詳細

  1. コマンドライン引数なしに起動する。
  2. 起動すると以下の各機能を選択できる。
    • 名前を入力して電話番号を検索・表示
    • 新たな名前に対し電話番号を登録
    • 既存の名前に対し電話番号を削除編集機能は不要。修整が必要なら、「削除→登録」すればよい)
    • 登録済の電話番号を一覧表示
  3. 電話帳機能を何回か使い、終了コマンドで終了する。
  4. 1、2を合わせて、以下のようなメニュー画面を表示するのも便利だ。
    
        番号を入力してください。
        1:電話番号を検索
        2:電話番号を登録
        3:電話番号を削除
        4:電話番号を一覧
        0:プログラムの終了
        ->
    
  5. プログラム終了時に、現在の電話帳データを、特定のファイルに保存し、次回起動時に自動で読み込む。
  6. 以下の場合に対応するエラー処理を行うこと。
    • 電話番号として不適切な文字列を登録しようとした。
    • 登録されていない名前のデータを削除しようとした

作業手順とヒント

step07課題レポート:「ファイルマージ」ツールでは、簡単なフローチャートを書き、プログラムのロジックを確認することを奨めた。それはこの課題でも同じである。できるだけ自分で考えてほしいが、参考のため実例を挙げる。
また、このような、ユーザとのインタラクションに応じて内部状態が遷移するアプリでは、フローチャートの他に、画面遷移図を書くと設計が捗る。画面遷移図とは、ユーザーからの入力と、表示画面の推移を表した図で、状態遷移図の一種である。図11-1に例を示す。

図11-1: 「電話帳データベース」の画面遷移図(例)

プログラムはおそらく100行内外だろうが、これまでのサンプルプログラムに比べれば長いし、初級者だと開発に3~4時間はかかるだろう。時間的余裕をもって開発に臨むこと。
次のstep12では、開発のためのヒントをいくつか示した。教科書とWeb上の情報も駆使して、作業してほしい。