この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
ど゛う゛じ゛で゛
前回までのあらすじ
ボックスガチャを作る事になりました。
改修、追加すべきAPIは以下で、
・ボックスガチャを引く POST: gachas/draw
・現在のボックスの中身を確認 GET: gachas/current_box_contents
・各ステージでのボックスの中身の確認 GET: gachas/all_box_contents
・ボックスガチャのリセット POST gachas/reset_box
それらの処理の為に、GachaBoxContentManagerという、ユーザーのボックスガチャの状態を一括管理するクラスを作成しました。
そうすると、
・現在のボックスの中身を確認 GET: gachas/current_box_contents
・ボックスガチャのリセット POST gachas/reset_box
この二つのAPIの実装は大体終わったも同然であり、また、
・各ステージでのボックスの中身の確認 GET: gachas/all_box_contents
このAPIの実装もマスタデータを返すだけなのですぐに終わりました。
残りは、
・ボックスガチャを引く POST: gachas/draw
のみです。
ボックスガチャを引く処理を作る
通常ガチャを引くコードは大まかに以下のように分けられていました。
APIが叩かれる
受け取ったパラメータを元にガチャのプロセスを初期化
ガチャのプロセスを実行する
アサーション
ガチャを指定回数だけ引く
ガチャの結果からユーザーデータを更新
ログの出力
実行後、レスポンスを返す
さーばーえんじにあ「このコードでの一番の問題は、1回ガチャを引く毎に中身のコンテンツが変わる事を考慮していないという事だ。
……どうしようかなこれ。
ボックスガチャを引く為に大きく改修すべき部分は、
・ガチャを指定回数だけ引く
・ガチャの結果からユーザーデータを更新
基本的にこの三つか。それ以外の部分は大きく変えたりは多分しなくて良い。
A. ガチャのプロセスを継承してその部分だけを変えるか
B. ガチャのプロセスそのものを拡張するか
どっちが良いかな。
うーん、例えば、他にも色んなガチャを実装するとしたらどうなるかな……。
Aだと、それぞれのガチャの特性に合わせた部分だけを変更した新しいプロセスを作る必要が出てくる。でも、他の部分は基本のガチャに準じている訳だからまあ、見やすいかな。
Bだと、一つのガチャのプロセスの中に色んなガチャに応じた分岐がどんどん増えていく事になる。完ッ璧に見辛いな。更に、改修を加える度に他のガチャに影響が出る可能性も否定出来ない。
Aだな、うん。そうしよう」
そうして、以下のように実装が進みました。
APIが叩かれる
(受け取ったパラメータを元にガチャのプロセスを初期化 <= ガチャ種が増えた事によって削除)
受け取ったパラメータと、そのガチャの種類に応じたプロセスの初期化を行う <= new!
プロセスを実行する
実行後レスポンスを返す
通常ガチャプロセス
初期化
アサーション
ガチャを指定回数だけ引く
ガチャの結果からユーザーデータを更新
ログの出力
ボックスガチャプロセス <= new!
初期化 <= GachaBoxContentManagerの初期化もする
アサーション
ガチャの指定回数だけ
ガチャを引く
ボックスの中身を減算する
ガチャの結果からユーザーデータを更新 <= GachaBoxContentManagerからボックスの中身も更新する
ログの出力
さーばーえんじにあ「こんな感じか。
既存の通常ガチャへの影響はほぼ無し。じゃ、APIも作り終えたから、後はテストコード書いて……マスタのインポート処理とかをマスタが来次第作成、クライアントとの繋ぎこみをその後、か。
あれ、まだまだやる事結構あるんか。
ちょっと面倒だな……」