Asakusa Framework Advent Calendar 2014の22日目です。
今日はOperator DSLをコーディングする際の注意点を2つ紹介します。
まずは、データモデルオブジェクトの使い回しについて。
ConvertやExtract・CoGroup等では、入力とは異なるデータモデルを新たに出力することが出来ます。
そこで使用する出力用のデータモデルオブジェクトは、Operatorクラスのフィールドに定義しておいて使い回すことが出来ます。
ただし、一旦出力する(Resultのaddに渡す、あるいはConvertでreturnする)と、内容が破壊されます。(厳密には「破壊されることがある」というだけですが、必ず破壊されるものと思っておいた方が無難です)
そのため、データモデルオブジェクトをフィールドに保持することは出来るのですが、使い始める箇所で毎回初期化(resetメソッドを呼び出すか、copyFromで別のオブジェクトから全コピー)するべきです。
2つ目は、Optionクラスを退避させる方法について。
データモデルのプロパティーの値を一時変数に退避させ、そのプロパティーを更新し、退避した値を別に使いたい、というような場合があると思います。
しかしAsakusaFWのOptionクラスは可変オブジェクトなので、退避をOptionクラスで行うと、プロパティーを更新したときに退避したつもりのOptionの内容も一緒に変わってしまいます。
(Java8のOptionalやScalaのOptionは不変オブジェクト、つまり一旦入れた内容を変更することが出来ないので、こういう問題は起きません)
(AsakusaFWのOptionはインスタンスを使い回すことでインスタンス生成コストを抑えるという考えなのだと思います。それなりの大量データを相手にするので)
注意していないと、なんとなく出来そうに見えるのですが、実際にやるとハマりますorz
※コメント投稿者のブログIDはブログ作成者のみに通知されます