2007-03-01

LabVIEW におけるデータの群れと、クラスタ抽出

LabVIEW で、ちょっと大きなアプリケーションを作っていると、アプリケーションの内部状態を格納しにくくなります。下の例は、4つの値を保持する例です。実際にはもっとたくさんデータがあるでしょうし、処理も複雑でしょう。ループのイテレーションをまたいで値を保持するには、シフトレジスタを使うわけですが、こんなのが100個もあったら半泣きです。Martin Fowler が「データの群れ」と呼んでいる不吉な匂いです。



0




オブジェクト指向なリファクタリングでは、クラスの抽出が処方箋として提案されていますが、LabVIEW 8.20 以降のクラスはちとややこしいので、代わりにクラスタを抽出しましょう。



クラスタは C の構造体のようなものです。アプリケーションでよく参照するデータ構造をまとめます。特定のデータを参照するには「名前でバンドル解除」、値を書き換えるときには「名前でバンドル」を使います。これですっきりします(ほんとは、もっとパラメータが多くて、もっと複雑な処理をしてるんですよー)。



1




他のプログラミング言語的に考えると、変数を使いたくなります。下の例のように、変数を使うことは技術的には可能です。が、これは、おそらく、バッドプラクティスだろうなぁと思います。



3




嫌がる理由はふたつあります。ひとつめは実行順序の問題です。LabVIEW は必要なデータがそろった時点でコード断片を実行します。ところが、ローカル変数の読み取りは、他のコードに依存しないため、グローバル変数と同じく、データの読み書きがいつ行われているか分かりません。知らない間におかしなデータが入ってるかも問題。デバッグが難しいです。



もうひとつはメモリ使用量です。ローカル変数を読み取るとき、必要に応じてメモリ上にコピーを作ってしまいます。実数のひとつやふたつコピーされてもいいのですが、これが大量のデータを保持する配列だったりすると、さすがにメモリを馬鹿食いしてしまします。



そんなわけで、クラスタにまとめて、シフトレジスタに保持しておくのが現実的な方法だと思ってます。