はじめに
某SI会社2Gのこんどうです。
前回の記事で、Amazon Q DeveloperのVSCode拡張機能を使い、リファクタリングを試してみました。
前回は、処理自体は正しく動くけどもっと良い書き方できるよね、というコードで試していましたが、
今回はそもそも機能として正しく動かないレベルのコードだとどうなのか試していきたいと思います。
まずは適当に実装
簡単なToDoツールを実装してみます。
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 [インデックス]" でタスク完了
というシンプルな内容です。
既にお気づきの方もいるかと思いますが、追加したタスクを変数に入れているだけなので、
データが保持されません。
一生懸命タスクを追加しても消えてしまいます。

Q Developerに改善をお願いしてみる
データの永続化について、追加の改善提案として指摘してくれました。
(改善提案というより致命的な欠陥だと思うのですが...)
重要度高のエラーハンドリングの不備と、データ永続化について修正をお願いしてみます。

データ永続化について、方式は特に指定しませんでしたが、JSONファイルで保存するようにしてくれたようです。
また、頼んでいないこと(使用方法の表示機能の追加など)も対応されていました。
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()
きちんと動くようになりました。
おわりに
全く使い物にならなかったプログラムが、かなり短時間できちんと使えるレベルに修正できました。
シンプルな機能ではありますが、手作業で実装するとそれなりに時間がかかると思います。
これから実務でもどんどんAmazon Q Developerを活用していきたいと思います!

