はじめに
ソフトウェア開発にChatGPTは使えるのか?という本がとても勉強になったので、この本の読んで自分なりに実践した内容を記事にしたいと思います。
この本の中で私がとても参考になったのは「第5章 各種開発手法の提案」で、この中で「5-1 DDDによる設計と実装」「5-2 TDDによるテストからの実装」が語られているので、それを取り入れた手法で開発をしてみたいと思います。
DDDとTDDについて
ちなみに私はDDD(ドメイン駆動設計)については、書籍で読んでなんとなくやることはわかっているけど、実践はしていないレベル。TDD(テスト駆動開発)についても書籍で読んである程度実践はしたけど、最近は仕事でコードを書いていないので、詳細部分を忘れそうになっているレベルです。
なので、それぞれChatGPTに説明してもらいましょう。(はじめにこれをやっておくとChatGPTの方もこれらを意識してくれそうな気がします。。。)
まずはDDDについて
次はTDDについて
DDDで設計
それでは早速DDDを用いた設計に入っていきましょう。ここでChatGPTと一緒に作る開発対象は簡単な日記投稿Webアプリとします。
それらしい回答が来たので、いったんクラス図にまとめてもらいます。
classDiagram
class User {
+id: int
+username: string
+password_hash: string
+verify_password(plaintext_password): bool
}
class Diary {
+id: int
+user_id: int
+title: string
+content: string
+date_posted: datetime
}
class AuthController {
+login(username, password): User?
+register(username, password): User
}
class DiaryController {
+post_diary(user_id, title, content): Diary
+view_diary(user_id): Diary[]
}
class UserRepository {
+find_by_username(username): User?
+save(user): void
}
class DiaryRepository {
+find_by_user_id(user_id): Diary[]
+save(diary): void
}
AuthController --> UserRepository : uses
DiaryController --> UserRepository : uses
DiaryController --> DiaryRepository : uses
User "1" --o "0..*" Diary : has
これをMermaid Live Editorなどで表示すると以下のようになります。
特に問題なさそうなので、実装に移って行きたいと思います。
TDDで実装
DDDでの設計もある程度できたので、ここからはTDDで実装していきたいと思います。
エンティティのテストコード
# tests/test_user.py
import pytest
from models.user import User
def test_user_creation():
user = User(username="testuser", password_hash="hashedpassword")
assert user.username == "testuser"
assert user.password_hash == "hashedpassword"
def test_password_verification():
user = User(username="testuser", password_hash="hashedpassword")
assert user.verify_password("plaintextpassword") == False # この例では、ハッシュ関数は実装していないため、失敗するはずです。
# tests/test_diary.py
import pytest
from models.diary import Diary
from datetime import datetime
def test_diary_creation():
date = datetime.now()
diary = Diary(user_id=1, title="Test Title", content="Test Content", date_posted=date)
assert diary.user_id == 1
assert diary.title == "Test Title"
assert diary.content == "Test Content"
assert diary.date_posted == date
エンティティのコード
# models/user.py
class User:
def __init__(self, id=None, username="", password_hash=""):
self.id = id
self.username = username
self.password_hash = password_hash
def verify_password(self, plaintext_password):
# TODO: 実際のパスワードハッシュと比較するロジックを後で実装する
return False
# models/diary.py
from datetime import datetime
class Diary:
def __init__(self, id=None, user_id=None, title="", content="", date_posted=None):
self.id = id
self.user_id = user_id
self.title = title
self.content = content
self.date_posted = date_posted or datetime.now()
このコードを自分の環境でpytestを実行すると今回は両方ともパスしました。エラーが出た場合はChatGPTにエラー内容を貼り付けて修正を頼めばコードを修正してくれます。
こんな感じで進めていけば、おそらく無事完成までたどり着けるでしょう。
おわりに
ソフトウェア開発にChatGPTは使えるのか?には他にもたくさん使える内容があるので、気になった方はぜひ手に取ってみてください。