Blog

util-evalで遊んでみました


こんにちは、GameTailor大城です。

GameTailorにはユーザー1人1人に応じたクリエイティブを生成する機能があります。
例えばユーザーが選択しているキャラクターを背景にする、などです。
この時、そのユーザーに応じたキャラクター画像やキャラの名前等をデータベースから取得する必要がありますが、ゲームタイトルによってユーザーデータの構造や必要な情報が異なる事があります。

この違いを設定ファイルで吸収し、実装から切り離すことが出来ないかな・・?と思いTwitterのutil-evalを調べてみました。

util-evalとは?

Twitter製のConfigライブラリです。ConfigをJSONやYAMLの代わりにScalaで書き、型チェックやコンパイラチェックを効かせるという思想を持っています。
https://github.com/twitter/util#eval

動作を確認したいと思います。

1.build.sbt を用意します

適当なディレクトリを作り、build.sbtを作ります。

2.Confgのクラスを用意します。

3.Configを用意します

4.読み込みます

5.実行します

無事、OrenoConfig.scalaが読み込まれ挨拶することが出来ました。読み込まれた後はScalaのクラス同様に扱い、IDEの補完を効かせることも出来ます。

読み込むコンフィグファイル(上記ではconfig/OrenoConfig.scala)は .scalaファイルではありますが、実行時にコンパイル・評価される為ビルド後でも設定を変更することが可能です。プロジェクト全体を再ビルドする必要はありません。

6.他にも・・・

ファイルからでなく直接文字列を評価することも出来ます。また、関数オブジェクトを評価して変数に格納することも出来ます。

※ ユーザーの入力値をEvalするのは、意図しないコードを実行してしまうという危険をはらんでいるのでやめましょう。

もっとEvalであることを活かしたい

冒頭で触れたユーザー応じた情報を返す、という部分でEvalを活用できないか考えます。

以下の様な要件があったとします。

前提

  • ユーザーのデータはJSONで格納されている
  • JSONの構造はゲームタイトルによって異なる
  • マスタの解決が必要である
    • {“character_id”: 12} といったようなデータがあった場合、12を解決しキャラクターの名前や画像URLを取得しなければいけない

インプット

  • ユーザーデータ
  • マスタデータ

求めるアウトプット

  • クリエイティブを作るために必要な情報
  • 例: {“character_name”: “ビッグ・キャッスル”, “character_image_url”: “http://xxxx”}

素直に実装すると以下のようになると思います

キャラクターの名前とイメージURLを取得することが出来ました。

しかし、character_name、character_image_urlを解決するためにcharacter_idをどのマスタデータと突き合わせればよいのかはゲームタイトルによって異なりますし、character_idがprofile_idやcard_idだったりした場合はどう対応しましょう?

うむむ・・・個別の対応が必要そうです。
この箇所は抜き出し、外から動作を変更できるようにすれば、ソースコードを変更せずに違いを吸収することが出来そうです。

マスタデータとユーザーデータをInputにして「ほげほげした結果」をOutputをする

ほげほげの部分を設定値で表現したいと思います。

コード

1.play-jsonの依存を追加します(build.sbtの編集)

jsonを扱うために、play-jsonの依存を追加します。

2.Configクラスを書き換えます

3.Configファイルに設定を書きます

Paramクラスのcodeへ記述した設定を使用して、ユーザーデータを解決します。

4.Mainクラスを修正

5.実行します

少しトリッキーな感じになっている部分もありますが、ゲームタイトル固有な記述をソースコードから切り離すことが出来ました。マスタデータが増えた、別のゲームタイトルも導入する、となった場合にはコンフィグに記述を増やすことで対応することが可能です。

Evalは実行にコストが掛かりますし、ユーザーの入力値を評価してしまうような作りにすると意図しないコードを実行してしまうという危険性を持っていますが、用途を間違えなければ強力な事ができそうです。

今回のサンプルコードは以下にあります。
https://github.com/oshiro-kazuma/util-eval-example

sys.exit //それではまた!

 

 

Copyright about logo
Copyright (c) 2002-2015 EPFL

Author

アバター
admin