ぴよぴよ日記

調べたことで有益そうなことを残してく

個人開発で要件定義、設計をした話

現在、個人開発で麻雀戦績管理アプリを作っていて、要件定義や設計について考えたことを共有したいと思います。

GitHubgithub.com

なぜやったのか

自分はWebエンジニアを目指している大学生ですが、まともなWebアプリを開発した経験がなく、フロントからインフラまでフルスタックで開発しようと思い立ちました。最初は何をするか手探りの状態でしたが、その「何をするのか」を定義するために要件定義、設計から始めました。

何をやったのか

GitHubにissueを作成し、やるべきことを明確化していきました。

要件定義

ここではアプリケーションの機能や、なぜそのような機能にするのかを箇条書きしていきます。この作業を通してやることとやらないことが明確化され、実装もうっすら浮かんできます。

実際の要件定義は以下のような感じになりました。

- ユーザーはまずサインアップする
   - ユーザー名、パスワードを設定する
      - ユーザー名は一意でないといけない
   - ユーザの削除機能はデータ整合性が複雑になるので作らない 
- サインアップ済みのユーザーはログインをする
   - ユーザー名、パスワードを入力
- セッション管理をし、セッションが張られていたらログインを省略し、ユーザーホーム画面に入る。
- 親ユーザーが部屋を作り、他のユーザーを登録していく
   - 作成できる部屋は10部屋まで
   - 親は参加のためのパスワードを設定する
   - 子は親に部屋IDとパスワードを共有してもらう
   - 3人以上いないと対局結果は登録できない、四麻は四人
   - 部屋の削除機能も必要
- 各部屋のホーム画面では各部屋での自分の戦績が表示される
- オフラインで対局した点数結果とそのユーザーと何家かをアプリに登録する
   - 点数結果だけでいいの?
      - 毎回上がり役とかを登録してると、面倒くさいと思う
   - 三麻も登録できるようにする。
   - 点数の合計点を計算し、ユーザーの入力をチェックする
   - 同点の場合は、東寄りが上位
- 取り消し機能も必要
   - 「対局」という粒度で削除できるようにする。これは点数とユーザを登録したひと塊。
      - 間違えてもその「対局」を消し、また新しい「対局」を作ればいい 
- 自分または同じ部屋のユーザーの成績を確認できるようにする 
   - 平均順位
   - 一位率
   - 二位率
   - 三位率
   - 四位率
   - とび率
   - 対局数
   - 平均得点
   - 各項目のランキングも出す
   - 「n局以上」で検索できるようにする
- 対局の登録、削除のたびに個人成績を計算しなおす

データベース設計

ER図を書きます。要件定義にあるように今回のアプリではユーザーのログイン機能や、そのユーザーが作成、参加する部屋、その部屋ごとの戦績など、テーブルが複雑にリレーションを張るので設計に入る前に整理することができます。ある程度機能を盛り込む予定の個人開発では必須でしょう。

画面遷移

画面遷移図を書きます。ページとその機能、ページ同士の遷移を定義します。ここで定義したことはすなわちユーザーアクションのすべてなので、ユーザーアクションごとのテストがしやすくなります。

実際の画面遷移図↓

以上のような要件定義、設計を行うことで、実装での手戻りが少なくなり、快適に実装ができました。

これから

アプリケーション自体はほとんど完成しているので、コンテナ化し、それをECSやCloud Runにデプロイし、運用していく予定です!