Posted at
sue445Day 5

Go!プリンセスプリキュアのGo言語実装「GoPrecure」

More than 1 year has passed since last update.

5日目なのでGo!プリンセスプリキュアのGo言語実装についての紹介です。1


GoPrecureとは?

Go!プリンセスプリキュア 2 のGo言語実装です。

https://github.com/sue445/goprecure


使い方


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()
// キュアフローラ


実際にはこんな感じ

flora_transform.gif


GoPrecureではフォームチェンジを忠実に再現

flora_exchange.gif



各プリキュアに対応するドレスアップキー

// キュアフローラ

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 が一番よかったが、直前までの入力を全部実行しているので標準出力に出力するメソッドとの相性が悪い




gore1.png

gore2.png



  • Transform の後に Exchange すると Exchange の標準出力だけ出してほしいのに直前の Transform のも一緒に出るので邪魔

  • この資料の大元は1年前に作ったものですが、念のため最新版で試したところこの挙動は同じでした


rubicureとGoPrecureの設計思想の違い


rubicureの設計思想


  • Rubyの柔軟性を利用してメタプロを大活用


    • クラスにメソッドはほとんど定義せずに method_missing でymlに飛ばすとか




  • transform!(変身) や attack!(必殺技) など破壊的メソッドには ! をつけるRubyの慣習に則った

  • 基本的にプリキュア全員対応するため特定のシリーズに特化させない汎用的な設計

  • rubicureのおかげでRubyの勉強になった


GoPrecureの設計思想


  • 静的型付けを意識した設計



    • DresupKey という型を const で定義することにより Exchange に未知のドレスアップキーが引数がわたらないようにした(コンパイルエラーになる)



  • Go!プリンセスプリキュアだけに特化させることでドレスアップキーとモードチェンジを関連付けた実装が実現した

  • GoPrecureのおかげでgolangの勉強になった


まとめ

新しい言語を学ぶ時はプリキュアを実装するといいと思います。





  1. 余談ですが僕の名前もGoです 



  2. http://www.asahi.co.jp/precure/princess/