enebularでif分岐やwhileループのようなデータの流れを組むときのTIPS

enebularでif分岐やwhileループのようなデータの流れを組むときのTIPSをまとめてみました。

Flow Editorではデータの流れを作る

enebularのFlow Editorでは、Flowの名前の通りデータの流れを作ることになります。

周辺でenebularを試される方が外部ユーザーの方も増えてきまして、私がNode-REDやenebular触りはじめたときに困ったことして、普段のプログラムでよく使うif分岐やfor文のようなデータの流れを表現するのが一つハードルだったなーと思い、書いてみます。

もちろんfunctionノードでいろいろできる

image

まずはじめにですが、functionノード。これは中にJavaScriptが書けるので、いろいろできるでしょう。

image

ですが、functionノードを駆使しすぎると、functionノードの中の自由度が高すぎるゆえに、あまりひとつのfunctionノードに処理をたくさん書いてしまいます。そうすると、ノードの中身を見ないと処理が分からないため、データの流れが見えにくくなる場合があるので注意です。

さて、今回はfunctionノードのアプローチでなく、ほかのノード群を使う用途をお伝えしていきます。

Discover Flowで今回の仕組みをFork

まず、Discover Flowから今回の処理を持ってきましょう。Flowの取り込み方はDiscovering Assetsドキュメントを参考ください。

https://enebular.com/discover/flow/59792cdf-140a-4dab-bd31-c51395d8349
image

if分岐のフローサンプル

if分岐のフローサンプルです。

image

仕組みを説明していきます。

今回判定したい文言はinjectノードで出力します。

image

injectノードを使ってdogという文字を出力しています。これがフローに従って流れていきます。

実際の分岐 switchノード

実際の分岐は「猫かチェック」と書かれているswitchノードというのを使います。

image

こちらです。ダブルクリックして詳細を見てみます。

image

このように2つの判定をしています。1番目はcatかどうかの判定。2番目は if文 でいうとelseにあたるotherwiseです。msg.payload に「dog」という文字として来たものを判定してます。

image

実際には、つくった分岐の数だけコネクタが出ていまして、debugノードに結果を出力しています。

var name = "dog";

if(name == "cat"){
    // 猫の結果
} else {
    // それ以外
}

プログラムで言うとこのようなイメージです。

if分岐のフローを動かしてみる

実際に動かしてみます。

image

injectノードの左のボタンをクリックして動かします。

image

今回はdogなので otherwise の分岐に動作します。

image

デバックタブに結果が表示されます。

image

デバッグタブでは、どこの debug ノードから出力されたかが、このように表示されます。

cat になおしてみる

injectノードでcatを出力してみましょう。

image

ダブルクリックしてinjectノードを編集します。

image

Payloadをcatに変更して、

image

デプロイしましょう。

image

動作させてみると、無事分岐してデバックタブにはこのように表示されます。猫の結果 debug ノードの方に分岐してますね。

whileループのフローサンプル

つづいて、whileループのフローサンプルです。

image

プログラムで言うとこのようなイメージです。

var loopCount= 0;
while( loopCount < 5 ){
    // ループ中結果
}
// 最終結果

値の初期化

まず loopCount を0で準備します。

image

変数を設定できるノードとして change ノードがあります。ダブルクリックして詳細を見てみます。

image

このようにRulesのところで、loopCountを0にする設定をしています。

whileループ部分

image

whileループ部分はこのあたりです。

image

if分岐でも使った switch ノードで判定をしています。

image

このように、5以下と到達したときのotherwiseの設定をしています。

image

そして、ループ中の分岐は、

image

このように動作します。

image

カウントする部分は、functionノードを使っていて、

image

このように加算しています。

whileループのフローを動かしてみる

image

startと書かれている inject ノードを動作させてみます。

image

whileループが動作してループ中結果、最終結果と書かれているdebugノードがそれぞれ反応します。

image

このように無事動作しました!

Node-REDでもデザインパターンとして良い記事がある

2018/10/22時点で、enebularのFlow Editor部分はNode-REDでできていまして、実はNode-REDでも zuhito さんが書かれた良い記事があります。

目からウロコ!Node-REDのデザインパターン10選 – Qiita

ifやwhileだけでなく、さまざまな処理のパターンがあるので気になる方は是非参考にしてください。

まとめ

ということで、今回はenebularでif分岐やwhileループのようなデータの流れを組むときのTIPSをお伝えしました。

働きとしては小さなものですが、複雑な構造を作っていく上では大切ですし、なにより、他のプログラムでデータの流れを作れる方が、うまく置き換えやすいTIPSだと思いますので、参考にしてみてください!