読者です 読者をやめる 読者になる 読者になる

くりにっき

ドリコムのプリキュアの人です

GoがGoでGo!プリンセスプリキュアを作った #gocon #cure_advent

AdventCalendar プリキュア golang

はじめに

これは「プリキュア Advent Calendar 2015」の7日目です

www.adventar.org

6日目

@ さんの ゆいちゃんという特異点的な存在についての考察 でした

xn--z8j2b8f.jp

7日目:GoがGoでGo!プリンセスプリキュアを作った

昨日開催された「Go Conference 2015 Winter」でLTをしたのでその発表資料になります。ご査収ください

eventdots.jp

togetter.com

スライド板

GoがGoでGo!プリンセスプリキュアを作った #gocon #cure_advent

エントリ版(内容はスライドと全く同じです)

GoがGoでGo!プリンセスプリキュアを作った

Go Sueyoshi a.k.a sue445

2015/12/06 Go Conference 2015 Winter

(兼 プリキュアAdventCalendar 7日目)


自己紹介

f:id:sue445:20151205023026p:plain

  • Go Sueyoshi a.k.a @sue445
    • golang歴 3ヶ月
    • Go歴 33年 (33歳)
    • 「Goのエンジニア」ではなく「エンジニアのGo」です(世間一般的にはRubyist
    • 【警告】Twitterは上級者向けのアカウントなので決してフォローしないでください!
  • Railsの会社でサーバサイド全般を浅く広く見守るお仕事
    • インフラ、アプリ、ライブラリ、社内ツールetc
  • 会社ではプリキュアおじさんと呼ばれています

【今期の嫁】キュアトゥインクル

f:id:sue445:20151205023218p:plain


【本妻】キュアピース

f:id:sue445:20151205023236p:plain


Agenda


「Go!プリンセスプリキュア」とは

日曜朝8:30からテレビ朝日系で放映しているアニメ


GoPrecureとは

「Go!プリンセスプリキュア」のgolang実装です

f:id:sue445:20151206234323p:plain

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

実際にはこんな感じ

f:id:sue445:20151205023306g:plain


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

f:id:sue445:20151205023321g:plain


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

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

f:id:sue445:20151205023335p:plain


f:id:sue445:20151205023348p:plain

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


golangのREPLがまだGoPrecureに追いついていない感があるw


プリキュアの他言語での実装の紹介


rubicureとGoPrecureの設計思想の違い


rubicureの設計思想

  • Rubyの柔軟性を利用してメタプロを大活用
    • クラスにメソッドはほとんど定義せずに method_missing でymlに飛ばすとか
  • transform!(変身) や attack!(必殺技) など破壊的メソッドには ! をつけるRubyの慣習に則った
  • 基本的にプリキュア全員対応するため特定のシリーズに特化させない汎用的な設計
  • rubicureのおかげでRubyの勉強になった

GoPrecureの設計思想

  • 静的型付けを意識した設計
    • DresupKey という型を const で定義することにより Exchange に未知のドレスアップキーが引数がわたらないようにした(コンパイルエラーになる)
  • Go!プリンセスプリキュアだけに特化させることでドレスアップキーとモードチェンジを関連付けた実装が実現した
  • GoPrecureのおかげでgolangの勉強になった

まとめ

新しい言語を勉強する時は自分の好きなものを実装すると良い。

補足

プリキュアRuby実装

こちらを御覧ください

sue445.hatenablog.com

Go!プリンセスプリキュアは(今のところ)43話連続神回

なのでみんなBD買うといいと思います

8日目