5日目なのでGo!プリンセスプリキュアのGo言語実装についての紹介です。1
GoPrecureとは?
Go!プリンセスプリキュア 2 のGo言語実装です。
- 以下の資料は Go Conference 2015 Winter の発表資料を元にしています。
- 当時のスライド https://sue445.github.io/gocon2015-winter/
使い方
go getしてimport
go get github.com/sue445/goprecure
import github.com/sue445/goprecure
プリキュアのインスタンスを作成
// キュアフローラ
flora := goprecure.NewCureFlora()
// キュアマーメイド
mermaid := goprecure.NewCureMermaid()
// キュアトゥインクル
twinkle := goprecure.NewCureTwinkle()
// キュアスカーレット
scarlett := goprecure.NewCureScarlett()
Name で名前を取得
flora := goprecure.NewCureFlora()
flora.Name()
// 春野はるか
Transform で変身
flora.Name()
// 春野はるか
flora.Transform()
flora.Name()
// キュアフローラ
実際にはこんな感じ
GoPrecureではフォームチェンジを忠実に再現
各プリキュアに対応するドレスアップキー
// キュアフローラ
g.DressupKeys = []DressupKey{Flora, Rose, Lily, Sakura, Royal}
// キュアマーメイド
g.DressupKeys = []DressupKey{Mermaid, Ice, Bobble, Sango, Royal}
// キュアトゥインクル
g.DressupKeys = []DressupKey{Twinkle, Luna, ShootingStar, Ginga, Royal}
// キュアスカーレット
g.DressupKeys = []DressupKey{Scarlett, Hanabi, Phoenix, Sun, Royal}
苦労したこと
- GoPrecureに適したREPLがない
- 4〜5種類くらい使って総合的に gore が一番よかったが、直前までの入力を全部実行しているので標準出力に出力するメソッドとの相性が悪い
例
-
Transform
の後にExchange
するとExchange
の標準出力だけ出してほしいのに直前のTransform
のも一緒に出るので邪魔 - この資料の大元は1年前に作ったものですが、念のため最新版で試したところこの挙動は同じでした
rubicureとGoPrecureの設計思想の違い
rubicureの設計思想
- Rubyの柔軟性を利用してメタプロを大活用
- クラスにメソッドはほとんど定義せずに
method_missing
でymlに飛ばすとか
- クラスにメソッドはほとんど定義せずに
-
transform!
(変身) やattack!
(必殺技) など破壊的メソッドには!
をつけるRubyの慣習に則った - 基本的にプリキュア全員対応するため特定のシリーズに特化させない汎用的な設計
- rubicureのおかげでRubyの勉強になった
GoPrecureの設計思想
- 静的型付けを意識した設計
-
DresupKey
という型をconst
で定義することによりExchange
に未知のドレスアップキーが引数がわたらないようにした(コンパイルエラーになる)
-
- Go!プリンセスプリキュアだけに特化させることでドレスアップキーとモードチェンジを関連付けた実装が実現した
- GoPrecureのおかげでgolangの勉強になった
まとめ
新しい言語を学ぶ時はプリキュアを実装するといいと思います。
-
余談ですが僕の名前もGoです ↩