

【ASTERIA Warp】実装に困ったケースの改善方法をご紹介します
こんにちは。ソリューション開発部の岩佐です。
皆さん、楽しいASTERIA Warpライフをお過ごしでしょうか。
すごく簡単に実装できた!とポジティブに思うこともあれば、いまいち実装方法がわからなかったり、思ったように動作せず、結局コードを書く方が早いとネガティブに思ったりすることもあるでしょう。
今回は私がうまく動作させられずに困った実装と改善方法、どのように実装したらよいのかわからなかった2つを紹介します。
皆さんが実装でつまずいた際に、「このパターンどこかの記事で見た気がする!」と思い出していただければ幸いです。
Mapper内からのフロー変数を更新する際の落とし穴
Mapper内からフロー変数の値を更新するのは非常に簡単です。
以下のようにMapperを開いて更新したいフロー変数に対して矢印を伸ばすだけです。


すごく直感的ですよね。一見困ることは何もなさそうに見えます。
実際、このように1回だけ更新する場合は何も問題ないのですが、読み込んだデータをMapperで処理する場合には注意が必要です。
例えば、このようなデータを読み込んでMapperで最初の列の値が"STEINWAY&SONS"となっているデータの件数をフロー変数に保存してみます。


最初の列が"STEINWAY&SONS"の行だけに適用するレイヤーを作成します。


フロー変数の初期値は0としているので、+1をしてフロー変数を更新します。


これでMapperを抜けたときにはフロー変数には3が入っていることを期待していますが、実際には1が入ります。


フロー変数には最後の1ループのみが適用されるようです。
今回のようにループするたびに変数を更新したい場合は、必ずマッパー変数を使用する必要があります。なのでマッパー変数を作成し以下のように書き換えます。
マニュアルにも記載がありましたので、参考にしてみてください。


このマッパー変数は、赤枠を設定することでMapper後にストリーム変数として使用できます。
直後で分岐したい場合はその値を、しばらく値を保持したい場合はフロー変数に保存するMapperを別途作成して使用するのが良いと思います。


SubFlow内から呼び出し元の親フローへ複数の情報を返したい
子の関数から親の関数に対して値を返したいというのは、どの言語で記載しても多々ありますし、もちろんAsteriaでも可能です。
単一であれば以下のように、Endの戻り値に設定するだけで親フローに返せます。


ただ、複数の値を返そうと思うと上記のような実装はできません。
もちろん文字列であれば、いったん連結して親フローに返し分割するという方法でも可能です。しかし、いろいろな型の情報を返したい場合はその方法だと煩雑になってしまいます。
(オブジェクト指向言語であれば返り値用のクラスを定義するという方法がありますが、ASTERIA Warpではそのような考え方はできません)
その場合、SubFlowとして呼び出されるフロー内で、公開フロー変数を定義することで親フローに返すことが可能です。
例えば以下のように3つのフロー変数を準備してみます。


この場合、Endの戻り値には何も設定しなくて問題はありません。
これでこのフローが終了した際に、親フローからストリーム変数として参照可能になります。
このフローをSubFlowとして呼び出す親フローを作成し、SubFlowの直後にMapperを用意してみます。


このようにストリーム変数として受け取れます。
公開フロー変数はフローを呼ぶ際の引数として使用される変数ですので、親フローからSubFlowとして呼び出す引数には増えてしまいますが、特に問題はないので無視で大丈夫です。
最後に
いかがでしょうか。今後も、このような小ネタ的な実装方法などがありましたら記載したいと思います。
良いASTERIA Warpライフをお過ごしくださいませ。