More Related Content
Similar to 条件式評価器の実装による管理ツールの抽象化 (20)
条件式評価器の実装による管理ツールの抽象化
- 7. 管理ツールを抽象化するとは?
■ 「抽象化」 = 汎用的に使えるようにする
● 複数のプロジェクトで使える
● 複数の用途で使える
■ 抽象化することのメリットは?
● 開発/運用の工数が少なくて済む
● 使い方を覚える必要がない
■ 抽象化は難易度が高い
● 何を汎用的にすればいいのか?
● 使いづらいツールにならないか?
● 設計ミスで余計に工数がかかる
7
- 11. 抽象化できるポイント2
■ UIを抽象化する
● データからUIを自動生成する
○ 条件式を構築するUIを保存された条件から作る
○ レスポンスの設定を行うUIを対象サービス(アプリ)
ごとにスキーマを設定し、自動生成する
11
String(os) == Enum(__os, "0,1", "iOS,Android")
os: iOS ▼
Android
UIを生成する部分リクエストから
もらう部分
条件式から作る例
String(os) == "1"
UIで選んだ値で展開※一部簡略化している
- 16. 関数の実現
■ 関数を使えるようにする
● 小文字から始まる関数呼び出しを対象
● 引数は任意の式
● オリジナルの組込み関数のみ使用できる
○ cond, until, hours, days,...
■ 関数呼び出しを評価する
● const.Valueを引数と戻り値に取る関数
● reflect.MakeFuncの思想と似ている
● 関数呼び出しごとにスコープを作る
○ 別の式を呼び出すcond関数のため
16
- 17. 関数の例
■ 引数と戻り値をconstant.Valueにする
17
func add(args []constant.Value) []constant.Value {
x, _ := strconv.ParseInt(args[0].String(),10,64)
y, _ := strconv.ParseInt(args[1].String(),10,64)
return []constant.Value{
constant.MakeInt64(x + y),
}
}
※スペースの都合上、エラー処理は省いてある
type Func interface {
Do(args []constant.Value) []constant.Value
}
例:足し算
- 18. 条件式を保存して呼び出す
■ cond関数
● よく使う式をDBに保存しておける
● cond関数を使って呼び出せる
● 呼び出し時に変数に値を束縛できる
18
String(os) == Enum(__os, "0,1", "iOS,Android")
保存された式 (id:1)
cond(1,"__os=1")
呼び出す式
列挙型の変数
変数の値
呼び出す式のID
String(os) == "1"
展開した式
- 20. 条件式からUIを自動生成する
■ 保存された式を組み合わせる
● __で始まる変数をUIで設定する
● UIで設定した変数を束縛する形でcond関数
を用い、バナーの条件式とする
20
String(os) == Enum(__os, "0,1", "iOS,Android")
os: iOS ▼
Android
保存された式 (id:1)
cond(1,"__os=1")JSON Schema
バナーに設定される式
作業者は保存された条件を
ANDやORで組み合わせるだけで済む
UIが生成される 選んだ値を設定する
- 27. 型をバリデーションに利用する
■ バリデーションを行う
● JSON Schemaを使えばJSONがスキーマを
満たしているかチェックできる
● 変数に型を導入することで、型情報を基にス
キーマを定義できる
● 型に沿ったバリデーションができる
■ オリジナル型を作る
● 組込み型としてオリジナルの型を作れる
○ URL, IntRange など
● バリデーションも行える
27