Asakusa Framework Advent Calendar 2013の18日目です。
そろそろOperator DSLの話に入っていきたいと思います(笑)
AsakusaFWでは、Flow DSLで演算子(メソッド)の実行順序を指定する感じでプログラミングします。
演算子には20個ちょっと種類があるのですが、どういう種類の演算子があるのか?というのは後日に譲るとして、、、これらの演算子は、実装方法に応じて「ユーザー演算子」と「コア演算子」の2つに分かれます。
ユーザー(プログラマー)が演算子(メソッド)の中身を実装しないといけないのがユーザー演算子、実装する必要が無いものがコア演算子です。
ユーザー演算子は、Operatorクラスを作り、その中にメソッドを定義します。メソッドにはどの種類の演算子かを示すアノテーションを付けます。
メソッド内は通常のJavaプログラミングと同じです。基本的には、引数のモデルクラスのオブジェクトを元に加工・演算を行い、モデルクラスのオブジェクトを出力します。
これが「Operator DSL」と呼ばれるものです。
Flow DSLやBatch DSLとは異なり、Operator DSLで定義した演算子(メソッド)は、アプリケーションの実行時に実際に呼ばれます。
モデルクラスはDMDLで記述したデータモデル毎に生成されるクラスです。
例えば以下のような感じです(あくまでイメージであり、実際はもっと色々なメソッドやクラスがあります)。
public class Example { private IntOption value = new IntOption(); private StringOption hoge = new StringOption(); public int getValue() { return value.get(); } public void setValue(int value) { this.value.~; } public IntOption getValueOption() { return value; } public Text getHoge() { return hoge.get(); } public void setHoge(Text hoge) { this.hoge.~; } public String getHogeAsString() { return hoge.getAsString(); } public void setHogeAsString(String hoge) { this.hoge.~; } public StringOption getHogeOption() { return hoge; } }
プロパティー毎にintやStringを扱うセッター・ゲッターメソッドがありますが、内部ではIntOptionやStringOptionという、AsakusaFW独自のクラスが使われています。
これらのOption系クラスは、値を保持する他にnullかどうかの情報を持っていたり、HadoopのWritableとの変換機能を担っていたりします。
(null関連の判定メソッドにはScalaのOptionクラスに似たものが感じられます(笑))
したがって、Option系クラスの特徴を知っていないと実行効率の悪いプログラミングをしてしまう可能性があります。
という訳で、各Optionクラスの使い方を自分のウェブページにまとめてみたので、ご覧下さい。(このブログでは書ききれないので^^;)