GroovyCureの紹介 #cure_advent

すみません、2日遅れのプリキュアアドベントカレンダー13日目の記事です。

GroovyCureの紹介をします。
まずはGroovyとはなんぞやと少し説明します。

Groovy(グルービー)は、Javaプラットフォーム上で動作するアジャイルな動的プログラミング言語である。
[中略]
Groovyの言語仕様はJavaのそれをベースとしており、基本的にJavaプログラマにとって慣れ親しみやすいものである。Groovyはスクリプト言語として大幅に簡易化された記述を許している。以下に簡略な記述を可能とするGroovy言語の特徴を示す。

Groovy - Wikipedia

えーと、つまりJVM上で動くJavaを簡単にした言語と考えて貰えればいいです。スクリプト言語なのでJavaやC#のようにコンパイルしなくても動きます。
そしてJavaの面倒臭い構文の省略やクロージャなど便利機能が追加されてとても便利な言語です。
能力的にはRubyやPythonなどと同じですが、Javaプログラマが新しく学ばなくても使えるという点でとてもいい言語だと思います。
最近一番良く使っている言語です。

ではこれがプリキュアと何が関係あるか
実はRubyやPythonにはすでにプリキュアの実装があるのです!
Rubicure
pycure

しかし、我がGroovy軍にはまだ実装がない!
そこで今年の春、pycureを元にプリキュアのGroovy実装を行いました。
基本は実装の単純だったpycureをパク参考にして、Groovy向けに書きなおした感じです。
GroovyCure

まず、構成としてはGroovy+Gradle+Spockです。
GradleはGroovy製のビルドツールでAntやMavenに代わる新しいものです。特徴としてGroovy(Java)でビルド構成をかけるのでXMLを使う他のツールより処理がわかりやすく、拡張性が高いです。
僕は元々ビルドツール使いこなしていないのでバージョン指定やライブラリの導入程度にしか使えていません。
SpockはGroovy製のテストツールです。BDDテストフレームワークでJUnitより簡潔に振る舞いを記述できます。
今回はテストをちゃんと書いて見ました。

今回実装する上でまず悩んだのが、全プリキュアのリストをどうやって保持するかでした。参考にした実装だとどうもクラス作んなくてもスタティックなリストライブラリで保持できるっぽいんですけど、クラス指向なGroovyだとそのままぶち込むことができなかった。
しょうがないのでstaticなスコープで処理して、呼び出し時にstatic importする手法をとった。
あとで実行例をみてもらうとわかるんだけど、他の言語より一手間かかることになってしまった。

あとは、プリキュアの情報を格納したオブジェクトはfinalかつ変更不可能なリストとして宣言しているので勝手に他のプリキュアを実装しようとしても例外を履くので安心!
各プリキュアやシリーズを取り出すときはGroovyのGetterの省略が使えるので簡単!
次に使い方を説明するよ。

まずインストール方法
これも他の言語実装だとRubyGemsやPypiを使って簡単にできるんだけど、Groovyの場合だともうちょっと大掛かりで同じような仕組みを使おうとしたらMaven Central RepositoryをつかってGradle(Grape)を使うしかなかった。
さすがにMavenにこんなものをOSSとして登録するのは気が引けたからGitHubから落としてGradleでインスコするようにした。

git clone https://github.com/ligun/groovycure.git
cd ./groovycure
gradle install

でインスコできる。
これでもうローカルリポジトリには入っているのでGradleなりGrapeで使えるよ。
今回は簡単にGrapeで使う方法を説明する。

@Grab('groovycure:groovycure')
import static groovycure.Precure.precure

@GrabアノテーションでGroovyCureを読み込むことができる(Mavenセントラルに入ってるものだったら先述のインスコ作業しなくても入れられるよ)
次にライブラリのインポートだが先に言ったようにリスト登録済みのstaticなオブジェクトをstatic importする。
これで準備完了。

現在放送中のプリキュアを表示したいなら

precure.now()

とかけばよい。

各シリーズのスラグは次のようになっている。
無印→unmarked
MaxHeart→maxheart
SplashStar→splashstar
Yes!プリキュア5→yes
GoGo→gogo
フレッシュ→fresh
ハートキャッチ→heartcatch
スイート→suite
スマイル→smile
ドキドキ→dokidoki
ハピネスチャージ→happinesscharge
(こう見たらハピチャは長いなぁ……)

たとえば各シリーズを呼び出したいときは

def series = precure.unmarked
println series

のようにスラグを指定してあげると呼び出すことができる。
同様にその中からキャラクターを指定するのは

def girl = series.girls.nagisa
println girl

のようにすれば良い。
シリーズの全キャラリストを取得するには

def girls = series.girls
println girls

としてあげるとMapとして取得できる。

プリキュアの変身はtransformメソッドでできる。
先ほど取得したなぎさのオブジェクトで例を取ると

println girl.transform()
println girl

とすると変身口上を言った後、girlの名前はプリキュア名になる。

と、こんなかんじでモロパクリ
すみません、本当は今回のカレンダーで機能追加やMavenの登録をしたかったのですが予想外の予定で全く作業を進めることができませんでした。
そのためこんな中途半端な記事になってしまいました。
今も@sue445さんが更新しているrubicureはともかくpycure相当の機能は実装したと思っています。
今後の展開としては細かい機能追加(全員変身の口上や必殺技等)をしていければと思います。

こんなバグや機能追加の報告、クソOSSでもMavenCentralに登録する方法など情報がありましたら教えてくだされば幸いです。
まずは記事あげて、ゆっくり加筆修正することにします。

今年は今週末にもう一つ記事を上げる予定ですのでそちらは遅れないように頑張ります。
それではみなさん、一緒にプリキュアなエンジニア生活を楽しみましょう!!

コメント

タイトルとURLをコピーしました