0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon Q Developerで、動かないToDoツールをリファクタリングしてみた

Posted at

はじめに

某SI会社2Gのこんどうです。
前回の記事で、Amazon Q DeveloperのVSCode拡張機能を使い、リファクタリングを試してみました。
前回は、処理自体は正しく動くけどもっと良い書き方できるよね、というコードで試していましたが、
今回はそもそも機能として正しく動かないレベルのコードだとどうなのか試していきたいと思います。

まずは適当に実装

簡単なToDoツールを実装してみます。

todo.py
import sys

todo_list = []

def add_task(title):
    todo_list.append({"title": title, "done": False})

def list_tasks():
    for i, t in enumerate(todo_list):
        status = "" if t["done"] else " "
        print(f"{i}: [{status}] {t['title']}")

def done_task(index):
    todo_list[index]["done"] = True

if __name__ == "__main__":
    command = sys.argv[1]

    if command == "add":
        add_task(sys.argv[2])
        print("タスクを追加しました")
    elif command == "list":
        list_tasks()
    elif command == "done":
        idx = int(sys.argv[2])
        done_task(idx)
        print("タスクを完了しました")
  • "add [タスクタイトル]" でタスク追加
  • "list" でタスク一覧表示
  • "done [インデックス]" でタスク完了

というシンプルな内容です。

既にお気づきの方もいるかと思いますが、追加したタスクを変数に入れているだけなので、
データが保持されません。
一生懸命タスクを追加しても消えてしまいます。
スクリーンショット 2025-12-27 1.09.18.png

Q Developerに改善をお願いしてみる

あえてざっくりと、改善ポイントを聞いてみます。
スクリーンショット 2025-12-27 1.14.19.png

データの永続化について、追加の改善提案として指摘してくれました。
(改善提案というより致命的な欠陥だと思うのですが...)

重要度高のエラーハンドリングの不備と、データ永続化について修正をお願いしてみます。
スクリーンショット 2025-12-27 1.17.52.png

データ永続化について、方式は特に指定しませんでしたが、JSONファイルで保存するようにしてくれたようです。
また、頼んでいないこと(使用方法の表示機能の追加など)も対応されていました。

todo.py(修正後)
import sys
import json
import os

TODO_FILE = "todo.json"
todo_list = []

def load_tasks():
    global todo_list
    if os.path.exists(TODO_FILE):
        try:
            with open(TODO_FILE, 'r', encoding='utf-8') as f:
                todo_list = json.load(f)
        except (json.JSONDecodeError, IOError):
            todo_list = []

def save_tasks():
    try:
        with open(TODO_FILE, 'w', encoding='utf-8') as f:
            json.dump(todo_list, f, ensure_ascii=False, indent=2)
    except IOError:
        print("エラー: ファイルの保存に失敗しました")

def add_task(title):
    if not title.strip():
        print("エラー: タスクタイトルが空です")
        return
    todo_list.append({"title": title, "done": False})
    save_tasks()

def list_tasks():
    if not todo_list:
        print("タスクがありません")
        return
    for i, t in enumerate(todo_list):
        status = "" if t["done"] else " "
        print(f"{i}: [{status}] {t['title']}")

def done_task(index):
    if 0 <= index < len(todo_list):
        todo_list[index]["done"] = True
        save_tasks()
    else:
        print(f"エラー: インデックス {index} は無効です (0-{len(todo_list)-1})")

def show_usage():
    print("使用方法:")
    print("  python todo.py add <タスク名>")
    print("  python todo.py list")
    print("  python todo.py done <インデックス>")

if __name__ == "__main__":
    load_tasks()
    
    if len(sys.argv) < 2:
        show_usage()
        sys.exit(1)
    
    command = sys.argv[1]
    
    if command == "add":
        if len(sys.argv) < 3:
            print("エラー: タスク名を指定してください")
            sys.exit(1)
        add_task(sys.argv[2])
        print("タスクを追加しました")
    elif command == "list":
        list_tasks()
    elif command == "done":
        if len(sys.argv) < 3:
            print("エラー: インデックスを指定してください")
            sys.exit(1)
        try:
            idx = int(sys.argv[2])
            done_task(idx)
            if 0 <= idx < len(todo_list):
                print("タスクを完了しました")
        except ValueError:
            print("エラー: インデックスは数値で指定してください")
    else:
        print(f"エラー: 不明なコマンド '{command}'")
        show_usage()

さっそく実行してみます。
スクリーンショット 2025-12-27 1.20.42.png

きちんと動くようになりました。

おわりに

全く使い物にならなかったプログラムが、かなり短時間できちんと使えるレベルに修正できました。
シンプルな機能ではありますが、手作業で実装するとそれなりに時間がかかると思います。
これから実務でもどんどんAmazon Q Developerを活用していきたいと思います!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?