LabVIEWオブジェクト指向プログラミングFAQ

概要

オブジェクト指向プログラミング (OOP) は、プログラミング言語、開発環境、および業界の違いを超えて使用されているプログラミングパラダイムです。この記事では、LabVIEW OOPに関する、よくある質問について説明します。このドキュメントは、OOPの基本的な用語とプロセスの理解していることを前提としています。

内容

LabVIEWオブジェクト指向プログラミング利点

C++のオブジェクト指向プログラミングLabVIEWオブジェクト指向プログラミング違いですか?


C++はテキストベースの関数型言語で、LabVIEWはグラフィカルなデータフロー言語です。この​違い​により、​オブジェクト​指向​機能​の​表現​方法​に​違い​が​生​じ​ます。

  • LabVIEWにはすべてのオブジェクトに根本的な先祖クラスがあります。C++にはありません。
  • C++にはコンストラクタがありますが、LabVIEWには不要です。
  • C++にはデストラクタがありますが、LabVIEWには不要です。
  • C++にはオブジェクトをパラメータとして渡すための、リファレンスによる構文と値による構文の両方があります。LabVIEWには値による構文しかありません。リファレンスは他の機能により作成されます。
  • LabVIEWは自動的にデータ変異を行うため、クラスが編集されていてもユーザは古いデータを読み出すことができます。C++では自動的にデータ変異が行われないため、ユーザはバージョンの変更を追跡しデータの変異コードを書く必要があります。
  • C++にはテンプレートがありますが、LabVIEW 8.2以降にはありません。
  • C++には純粋仮想関数がありますが、LabVIEW 8.2以降にはありません。
  • C++には複数の継承がありますが、LabVIEWにはありません。
     

これらの相違点に関する詳細は、Developer Zoneチュートリアル『LabVIEW​オブジェクト​指向​プログラミング:​設計​上の​判断』を参照してください。

LabVIEWオブジェクト指向プログラミング利点ですか?


LabVIEWの新規ユーザにとっての利点は何ですか?

  • LabVIEWの強みは、コンピュータサイエンスの技術をプログラマ以外の人にも利用可能にすることです。LabVIEWオブジェクト指向プログラミングは最も先進的なプログラミング技術を新規ユーザに提供します。オブジェクト指向プログラミングでは計画段階においてより多くのコミットメントが必要であるため、一般的に、大規模ソフトウェアの開発に採用される場合が多いです。
  • オブジェクト指向プログラミングは、機能仕様で使用されている用語を使用してソフトウェア計画を行います。機能の説明には、スクリーン上に表示する項目や機能が操作を行うデータが記載されます。オブジェクト指向プログラミングでは、データベースオブジェクト、ボタンオブジェクト、電子メールオブジェクトといった用語ごとに関連コードを書くことができます。


B. 経験のあるグラフィック言語プログラマにとっての利点は何ですか?

  • デバッグが容易 ― コードがモジュール化されているため、バグが存在するかもしれないVIを絞ることができます。
  • 保守が容易 ― オブジェクト指向プログラミングにより、時間の経過とともに開発者の生産性が上がってゆきます。開発者は機能を追加したい分野を容易に識別することができ、関係のないコード箇所でエラーを招く可能性が少なくなります。


LabVIEWオブジェクト指向プログラミング使用すべどのよう場合ですか?
 

  • 長期間にわたって保守されるVI
  • 大規模アプリケーション
  • 複数の開発者が同一のVIを作業


LabVIEW​オブジェクト​指向​プログラミングを使用​すべ​き​で​ないの​は​どの​よう​な​場合​です​か?
 

  • 開発期間の短いユーザ
  • 計測を目的とした単一VIを素早く開発するような場合、LabVIEWクラスは過度の作業


LabVIEW​オブジェクト​指向​プログラミング​の​使用​例​を​教え​て​くだ​さい。


タスク​ベース​の​アプローチ​と​オブジェクト​指向​の​アプローチ​を​比較​し​て​いる​テスト​および​計測​の​例​は、​LabVIEW 8.2​以降​に​含​ま​れる​「Board Testing」​サンプル​プロジェクト​を​参照​し​て​くだ​さい。

labview\examples\lvoop\BoardTesting\Board Testing.lvproj

LabVIEWオブジェクト指向プログラミング使用法

LabVIEWオブジェクト指向プログラミング使用についてさらに学習したですが、トレーニング教材、アプリケーションノート、チュートリアル、デモスクリプト、サンプルなどありますか?


LabVIEW 8.2以降には、LabVIEWオブジェクト指向プログラミングのサンプルが含まれています。このドキュメントの追加情報セクションも参照してください。

既存プロジェクトLabVIEWオブジェクト指向プログラミング移行するどうしたらよいですか?


既存のタイプ定義をLabVIEWクラスに変換するところから開始します。プロジェクトエクスプローラウィンドウでタイプ定義を右クリックし、ショートカットメニューから制御器の中身をクラスに変換を選択します。LabVIEWクラスの作成に関する詳細は『LabVIEW ヘルプ』を参照してください。

メモ: 制御器のデフォルト値と定数は変換時に保持されません。タイプ定義の詳細にアクセスするには、そのタイプ定義にアクセスする必要のあるクラスにVIを追加してください。オブジェクト指向プログラミングの基本は、操作するデータに基づいてVIをグループ化することです。オブジェクト指向設計に関する詳細は、追加情報セクションにあるNI Week 2006の2つのプレゼンテーション(英語)を参照してください。

LabVIEWオブジェクト指向プログラミング「リファレンス」実装するどうよいですか。


LabVIEW 8.2以降で含まれる「ReferenceObject」サンプルプロジェクトを参照してください。

labview\examples\lvoop\ReferenceObject\ReferenceObject.lvproj

基本的には、クラスのプライベートデータをリファレンスにします。このサンプルでは、単一要素のキューリファレンスを使用してそれを実装する方法を示しています。GOOPツールキットを使用することもできます(以下のLabVIEWオブジェクト指向プログラミングとGOOPツールキットセクションを参照してください)。

LabVIEWクラスLabVIEW Real-Timeその他デスクトップターゲットでも動作ますか?


LabVIEW 2009では、オブジェクト指向がLabVIEW Real-Timeターゲットでサポートされるようになりました。LabVIEW 8.6以前では、オブジェクト指向プログラミングはリアルタイムではサポートされていません。 

VI閉じると、なぜVI「変更保存」ダイログボックスと、LabVIEWクラス「変更保存」ダイログボックス表示れるですか?表示れるすべて保存するためダイログボックス(1つ)ないなぜですか?


VIを閉じる際、LabVIEWはそのVIが閉じられることにより使用されなくなるサブVIをすべて把握しているため、それらを保存するかどうかを尋ねるダイアログボックスを表示します。一方、クラスはすべてのデータインスタンスがメモリからなくなるまでメモリに保持されるため、任意のVIが閉じられることでデータの最後のインスタンスが閉じられるかどうかについてはLabVIEWは把握できません。VIのコード内にクラスへのリファレンスがない場合でも、どこかのバリアント内にクラスのインスタンスが含まれる可能性があります。すべてのVIがアイドル状態である場合、何個のクラスインスタンスがこれらのVIとともになくなるのか、それがメモリ内に残っているすべてのクラスインスタンスにあたるのかを、LabVIEWは把握することができます。LabVIEWは、クラスがVIとともにメモリからなくなることを把握しているため、VIやライブラリに対する変更を保存するかを尋ねる「変更を保存」ダイアログボックスにおいて、クラスに対する変更を保存するかについても一緒に尋ねることができます。ただし、いずれかのVIが実行中の場合、インスタンスの数は常に変動しています。またVIの実行中には、データがキューやノーティファイアなど検索不可能な場所に隠れてしまう可能性があります。VIがアイドル状態になった場合にのみこれらの追加スペースが空になります。また、LabVIEWが既にチェックし終わった場所に、実行中のVIによって新規インスタンスが作成されてしまう場合もあります。このため、VIの実行中にインスタンスを数えることは不可能です。LabVIEWは変更を保存するかどうかを尋ねた後で実行中のVIを中断するため、その時点では、クラスがメモリからなくなるかどうかはLabVIEWには判断できません。すべてのVIがアイドル状態にありLabVIEWがデータの検索を行うことができたとしても、データの検索には非常に多くの時間がかかるため、LabVIEWは検索を試みることはありません。したがってほとんどの場合、VIを閉じるとクラスに対する変更を保存するかどうかを尋ねる「変更を保存」ダイアログボックスが別に表示されます。

プロジェクトを閉じる場合のみ、LabVIEWがVIやライブラリとともにクラスを閉じることができ「変更を保存」ダイアログボックスが1回のみ表示されます。この場合、プロジェクト内のすべてのVIが閉じられるため、LabVIEWはクラスのすべてのデータインスタンスを考慮することなく廃棄してよいということが判断できます。

LabVIEWオブジェクト指向プログラミングGOOPツールキット

GOOPツールキットですか?


GOOP開発パッケージはナショナルインスツルメンツのウェブサイトから無料でダウンロードいただけます。 

LabVIEW 8.2以降でもGOOP使用できますか?


はい。

Endevo​社​の​GOOP​ツール​キット​と​LabVIEW​オブジェクト​指向​プログラミング​を​一緒​に​使用​すると​どの​よう​に​動作​し​ます​か?​ それら​を​一緒​に​使用​すべ​き​時、​またはLabVIEW​オブジェクト​指向​プログラミング​ではなく​Endevo​社​の​GOOP​ツール​キットを​使用​すべ​き​時​は​どの​よう​な​場合​です​か?​また​その​使用​法​について​教え​て​くだ​さい。


多くのユーザはアプリケーションにはLabVIEWクラスが最適であると答えるでしょう。LabVIEWクラスは、ユーザにとって馴染みの深い「クラスタ」のように動作します。

リファレンスは、並列に実行する複数コードセクション間の通信に使用されます。システムリソースのUMLモデリングを行っているお客様にとってリファレンスモデルは非常に有益になるため、GOOPクラスを作成したいと思われるでしょう。リファレンスは、グラフやツリーデータストラクチャを作成する際にも有益です。ただしこのような場合も、GOOPクラスの核となるデータフィールドはLabVIEWクラスでも提供されている可能性があります。並列コードセクション間の通信にリファレンスやその他の手段を使用するには、ロック、競合状態、その他の複雑な内容について知っておく必要があります。

リファレンスモデルを使用すると、メモリ内でそのクラスが確実に重複しないようにすることができます。これは、多くのメモリを必要とするクラスの場合に有益です。

Endevo​社​の​GOOP​ツール​キット​を​使用​し​て​いる​アプリケーション​を​LabVIEW​オブジェクト​指向​プログラミング​に​移行​すべ​き​です​か? GOOP​ツール​キット​を​使用​し​て​いる​顧客​の​既存​アプリケーション​を​LabVIEW​オブジェクト​指向​プログラミング​で​実装​すべ​き​場合​は​どの​よう​な​時​です​か?


既存のGOOPクラスをLabVIEWクラスとして書き直す必要性はありません。1つには、動作しているコードを重大な理由もなく破棄すべきでありませんし、GOOPクラスはLabVIEW 8.2以降では引き続き動作します。実際のところ、GOOPツールキットはLabVIEWで書かれているのです。さらに、リファレンスによって動作しているコードを値によって動作するコードに変更するには、極めて膨大な作業が発生します。

移行する理由のひとつは、パフォーマンスです。オブジェクトに対する大量のオーバーヘッドは、各関数の呼び出しにおいてリファレンス検索、インスタンスのロック、データ抽出が行われる際に発生します。GOOPツールキットではこのオーバーヘッドを極力減らすように優れた設計が行われていますが、オーバーヘッドがあることは否めません。さらに、リファレンスを使用しなければ並列処理が可能な多くの操作が、リファレンスを使用することで並列処理できなくなります。リファレンスによって動作する必要がなくパフォーマンスを重視するクラスがある場合は、GOOPクラスからLabVIEWクラスへの移行を検討してもよいでしょう。

GOOP使用いるアプリケーションLabVIEWオブジェクト指向プログラミング移行するどうよいですか?


この​質問​に対する​回答​は​状況​によって​異​なり​ます。LabVIEWでは、自動変換を行う方法が提供されていません。

LabVIEWオブジェクト指向プログラミングEndevoGOOPツールキットパフォーマンス上の違いありますか?


同じ状況下においては、LabVIEWクラスはGOOPクラスよりも優れたパフォーマンスを発揮します。これはLabVIEWクラスがデータフローに沿っており、ダイナミックディスパッチのネイティブコンパイラであるためです。とはいえ、同等の状況はほとんど存在しません。LabVIEWクラスはクラスタを置換えてデータフローを改善するように設計されています。GOOPクラスはLabVIEWにリファレンスを追加する手段です。2つのクラスは異なる目的を果たしています。新規クラスの作成時には、パフォーマンスではなくクラスが必要とする機能によって、GOOPクラスかLabVIEWクラスかを決定すべきです。

技術詳細

タイプ定義クラスタ代わりLabVIEWクラス使用することられるパフォーマンス上の違いですか?


さまざまな種類のコンピュータにおけるベンチマークでは、この2つのパフォーマンスはほとんど同じであることが明らかになっています。パフォーマンスに関する詳細については、下の質問を参照してください。 

通常サブVI呼び出し比較て、サブVI動的呼び出し行う場合パフォーマンス上のオーバーヘッドですか?


サブVIのダイナミックディスパッチを行うと、どのサブVIを呼び出すかをLabVIEWが検索するため、ある程度の小さなオーバーヘッドが発生します。オーバーヘッドの量は一定であり、より多くのクラスを追加しても、クラスにより多くの動的VIを追加しても増加しません。LabVIEWが呼び出す実際のサブVIの機能に合致させるため、サブVI呼び出しによってパラメータのコピーが余分に作成されてしまうと、パフォーマンスに影響を与える可能性があります。呼び出すことを想定していないダイナミックVIにおいてもフロントパネル上の入力端子をフロントパネル上の出力端子に配線することによって、この問題を回避することができます(たとえば、子VIによって上書きされるコネクタぺーンを定義するためだけに存在する親VIなど)。ダイナミックディスパッチにおいてオーバーヘッドパフォーマンスがどのようにして一定に抑えられているかに関する詳細は、『LabVIEW​オブジェクト​指向​プログラミング:​設計​上の​判断』を参照してください。

LabVIEWクラスライブラリプロジェクトライブラリ相違ですか?


LabVIEW​クラスはプロジェクト​ライブラリ​の​一種ですが、データタイプ​の​定義​に​特​化​し​てい​ます。LabVIEWクラスは、プロジェクトライブラリと同様に、メンバーVIのスコープとネームスペースを定義します。VIは1つのLabVIEWクラスにのみ所有されます。 

LabVIEWクラスには、プライベートデータ制御器が含まれます。プライベートデータ制御器はクラスのデータ値を定義します。この特別な制御器は他の種類のライブラリには含まれません。この制御器はクラスファイル内に格納されます。​LabVIEW​クラス​に​は、​ライブラリ​の​持つ​すべて​の​プロパティ​以外​に​追加​の​プロパティ​も​あり​ます。​追加のプロパティは、クラスプロパティダイアログボックスの継承ページ、プローブページ、ワイヤの外観ページで確認できます。

プロジェクト​ライブラリ​に​は​あっ​て​LabVIEW​クラス​に​は​ない​唯一​の​機能​は、​サブ​ライブラリ​を​持てる​こと​です。 

LabVIEWオブジェクト指向プログラミング使用すると、いつロードますか?


LabVIEWクラスを使用したVIの場合、VIがそのサブVIをロードするのと同様に、VIをロードするとクラスがロードされます。LabVIEWクラスは、すべてのメンバーVIとその親クラスをロードします。親クラスは子クラスのロードを自動的にトリガしません。親クラスは子クラスとのリンクを持ちません。親クラスのメンバーVIが子クラスを使用している場合は、子クラスがロードされます。

「値による手法」「リファレンスによる手法」ですか? それぞれ利点欠点ですか?


「値による手法」では、そのワイヤの種類において実際のデータがワイヤ上で渡されます。「リファレンスによる手法」の場合、その種類のデータへのリファレンスがワイヤで渡され、実際のデータはセントラルリポジトリに格納されます。数値、配列、クラスタ、文字列、ブール、パスなど、ほとんどのLabVIEWのデータタイプは値を渡します。一般的に、リファレンスで渡されるのは、通信用に使用する場合や、ファイルrefnum、キューrefnum、VIサーバrefnumなどのシステムリソースを反映させる場合のみです。LabVIEWクラスでは値が渡されます。​値​による​構文​では、​各​オブジェクト​に​それぞれ​の​データ​値​が​含​ま​れる​ため、​それぞれ​オブジェクト​を​独立​し​て​修正​する​こと​が​でき​ます。​リファレンス​による​構文​では、​複数​オブジェクト​が​参照​する​データ​の​インスタンス​は​1​つ​のみ​です。1​つ​の​オブジェクト​が​データ​を​修正​する​場合、​その​データ​を​読み書き​する​その他​の​オブジェクト​と​競合​しない​よう​に​注意​する​必要​が​あり​ます。主な利点と欠点は以下の通りです。

  • 値を使用すると競合状態を回避することができるため、LabVIEWなどの極めて並列処理の多い環境においては適しています。
  • 値を使用すると、データのコピーをいつ作成すべきかの判断がコンパイラによって行われるため、プログラマの負担が軽減されます。
  • リファレンスを使用すると、プログラマによる割り当てが可能であるため、単一インスタンスのリソースや大きなデータセットの場合には適している場合があります。


LabVIEWオブジェクト指向プログラミングなぜリファレンスではなく使用するですか?


LabVIEW​オブジェクト​指向​プログラミング:​設計​上の​判断』を参照してください。

LabVIEWクラス作成/管理行うUMLツールナショナルインツルメンツから提供ていますか?


NIからUMLツールは提供されていません。Endevo社より、UMLダイアグラムからクラスを生成し、コードからUMLダイアグラムを生成するツール(英語)が提供されています。このツールは現在のところGOOPクラス用ですが(上記の「LabVIEWオブジェクト指向プログラミングとGOOPツールキット」セクションを参照)、次期バージョンではLabVIEWクラスも同様にサポートされるようになります。

LabVIEWクラス制御表示「現在デフォルト設定する」オプション使用できないなぜですか?LabVIEWオブジェクト指向プログラミング定数設定できないなぜですか?


現在の値をデフォルト設定にする
オプションは、LabVIEWの便利な機能です。さまざまなVIにおいて頻繁に使用されるかもしれません。優れたユーザインタフェースを提供するのが複雑であるため、この機能はLabVIEW 8.2以降のLabVIEWクラスでサポートされていません。このため、ユーザはプライベートデータであるためにそのデータを実際には見ることができなくても、データがデフォルト値と異なる場合は気付きます。この機能は、今後のLabVIEWのバージョンで対応する優先事項のひとつです。

ダイナミックVI再入可能設定できないなぜですか?


LabVIEW 8.2では再入可能なダイナミックVIはサポートされていません。なぜなら、ダイナミックサブVIノードの編集時にはLabVIEWが実行時にどのサブVIを呼び出すのかが不明であるため、各ノードで可能性のあるすべてのサブVIのクローンを作成する必要が生じるからです。これにより、メモリが非常に多く使用されてしまいます。

(LabVIEW 8.5) LabVIEW 8.5では再入可能なダイナミックVIを使用できます。

ダイナミックディスパッチVIを再帰VIとして構成したり、ダイナミックディスパッチVI自体の定義の一部として使用することができます。再帰VIはそのブロックダイアグラム内あるいはサブVIのブロックダイアグラム内で自分自身を呼び出すことができます。再帰は、同じプロセスの出力において何度も処理を行う場合に便利です。ダイナミックディスパッチメンバーVIを再入可能に設定して再帰を許可し、インスタンス間でクローンを共有するよう構成することができます。

VIを再帰可能に構成するには以下の手順に従います。

  1. ダイナミックディスパッチメンバーVIを開くか作成してください。
  2. VIを再入可能に設定します。
     
    1. ファイル→VIプロパティを選択して、VIプロパティダイアログボックスを表示します。
    2. カテゴリプ​ル​ダウン​メニュー​から実行を​選択​して実行プロパティページを表示​し​ます。
    3. 再入​実行チェック​ボックス​を​オン​にしてインスタンス​間​で​ク​ローン​を​共有​するを​選択​し​ます。
       
  3. 再帰を行うメンバーVIを実装します。
     

メモ:  無限再帰に対する対処を行わない場合、不要なメモリ使用が発生したりLabVIEWがクラッシュする可能性があります。無限再帰を回避するには、再帰VIをケースストラクチャ内で呼び出してください。

追加情報

  • LabVIEW​オブジェクト​指向​プログラミング:​設計​上の​判断』を参照してください。 
  • コミュニティWebドキュメント: Applying Common Object-Oriented (OO) Design Patterns to LabVIEW(英語)
    このドキュメントでは、他のプログラミング言語のさまざまなデザインパターンと、それらのパターンをLabVIEWで実装する方法について説明します。デザインパターンを使用することで、特定のプログラミング課題を解決するために作成する必要のあるクラスを識別し、クラス間の相互動作を最も効率よくすることができます。このドキュメントはプログラミング技術の進歩に伴い随時修正されます。
  • LabVIEWクラスとハードウェアの陳腐化:How to Mitigate Hardware Obsolescence in Next-Generation Test Systems(英語)
  • Object Oriented Design Patterns Technical Manual and Exercises(英語) - LabVIEWクラスを使用した中間レベルデザインパターンについての自習形式ハンズオンガイドに対応したドキュメントおよびサポートVIです。LabVIEWクラスの基本を理解しており、より大きなアプリケーションコンテキストでこれらのクラスを使用する方法を確認したい学生を対象としています。このハンズオンセッションは、NI Week 2011で初めて紹介されました。サイトにあるVIはLabVIEWバージョン2011用に保存されています。バージョン2010に対応したVIもご利用いただけます。Webページのコメントセクションで「2010」を検索してください。

 

Was this information helpful?

Yes

No