概觀
下列為 LabVIEW 物件導向程式設計 (LabVIEW Object-Oriented Programming,LVOOP) 常見問題的相關解答。
使用 LabVIEW 物件導向程式設計的優點
1. 物件導向程式設計 (OOP) 的一般定義與使用的原因?
在多種程式設計語言中,物件導向程式設計已經展現了本身程序化語言設計 (procedural programming) 的優點。物件導向程式設計加強了程式碼區段間的乾淨介面、可輕鬆進行除錯,並可針對大型的程式設計團隊進行調整。
從 wikipedia:
物件導向程式設計的概念,即為電腦程式應該由個別單位所構成;或是可互相動作的物件,相反於程式應為函式集合的傳統觀念;或僅是對電腦的一系列指令。每個物件均可接收訊息、處理資料,並傳送訊息至其他物件。每物件均可檢視為獨立的小型機器,或是具有獨立角色或責任的演員。
物件導向程式設計號稱能夠於程式設計中達到更好的彈性與維護性,並廣泛使用於大型的軟體設計中。物件導向程式設計的擁護者並聲稱,對新接觸程式設計的工程師,更能輕鬆學習物件導向程式設計;同時更能輕鬆開發並維護物件導向程式設計。與其他程式設計語言相較,物件導向程式設計可運用至更多直接分析、編碼,並了解複雜的狀況與程序。
2. C++ 與 LabVIEW 中的物件導向程式設計有何分別?
C++ 為文字架構的函式語言。LabVIEW 為圖形化的資料流語言。此 2 種語言表現物件導向功能的方式即有所不同:
- LabVIEW 針對所有物件,具有最基礎的類別 (Class) 架構。C++ 並沒有。
- C++ 具有建構元 (Constructor)。LabVIEW 卻不需要。
- C++ 具有解構元 (Destructor)。LabVIEW 卻不需要。
- 當 C++ 將物件轉為參數時,將同時具有參考與數值語法。LabVIEW 僅具有數值語法 (Value syntax),而以其他功能建立參考。
- LabVIEW 具有自動化的資料轉化 (mutation),因此當類別 (Class) 經過編輯之後,使用者可檢索舊資料。C++ 不會要求使用者查看版本變動,也不會要求寫入資料的轉化程式碼 (Mutation code)。
- C++ 具有範本。LabVIEW 8.2 不具範本。
- C++ 具有完全虛擬成員函數 (Pure Virtual Function)。LabVIEW 8.2 則不具備該函數。
- C++ 具有多重繼承 (Inheritance)。LabVIEW 則不具備。
若需要這些區別的詳細資訊,請參閱技術文章:LabVIEW 物件導向程式設計 (LVOOP):於設計後所做的決定。
3. LabVIEW 物件導向程式設計 (LVOOP) 的主要優點?
A. 剛使用 LabVIEW 的工程師能獲得何種優勢?
1. LabVIEW 的強大功能,讓非程式設計師都能夠使用電腦科技的功能。LabVIEW 物件導向程式設計 (LVOOP) 將某些最進階的程式設計技術,帶給初階使用者以進行運用。物件導向需要 1 個以上的承諾 (Commitment) 以進行計畫,因此僅於使用者開始著手大型的軟體時,才會開始選擇。
2. 物件導向透過符合功能規格的項目 (term),以提供規劃軟體的方法。有關項目 (term) 的功能討論,將顯示於畫面或於功能將運用的資料之上。透過物件導向,即可寫入程式碼於計畫中的以下相同項目:資料庫物件、按鈕物件、電子郵件物件。
B. 具經驗卻未使用物件導向程式設計的 G 程式設計師,能獲得何種優勢?
1. 輕鬆除錯—更多的模組化程式碼,可讓使用者縮小可能存在錯誤的VI 清單。
2. 輕鬆維護—物件導向的設計可導向更多架構,讓開發者提高效率。開發者可輕鬆識別要新增功能的範圍,並減少將錯誤帶入程式碼的非相關區段。
4. 誰應該使用 LabVIEW 物件導向程式設計?
- 需要長時間維護的 VI
- 大型應用
- 於相同 VI 中作業的多個開發者
5. 誰不應該使用 LabVIEW 物件導向程式設計?
- Express 的使用者
- 若想以快速、單一的 VI 進行量測,則 LabVIEW 類別 (Class) 的功能過強
6. 可有客戶使用 LabVIEW 物件導向程式設計的方式或應用範圍範例?
針對工作 (Task) 架構與物件導向方式的測試與量測範例,請參考附於 LabVIEW 8.2 中的 Board Testing 範例。
labview\examples\lvoop\BoardTesting\Board Testing.lvproj
使用 LabVIEW 物件導向程式設計的方法
1. 應於何處了解更多使用 LabVIEW 物件導向程式設計 (LVOOP) 的方法?有任何教育訓練、應用說明、線上訓練、Demo,與範例嗎?
LabVIEW 8.2 已附有 10 個 LVOOP 的範例。
2. 應如何將現有的專案轉換至使用 LVOOP?
最簡易的開始方法,即是轉換現有的類型定義為 LabVIEW 類別。亦可於 Project Explorer 視窗中以右鍵點選 typedefand,並選擇捷徑功能表中的 Convert Contents to Class。參閱 LabVIEW Help 以獲得更多建立 LabVIEW 階層的相關資訊。
備註:在轉換程序期間,LabVIEW 並不會提供控制的預設值與常數。若需要 typedefs 的詳細資訊,請新增 VI 至需要存取類型定義的階層。此種 VI 分組方式,是根據 VI 針對物件導向程式設計所使用資料的方法。
3. 應如何於 LVOOP 中建立「依參考」的建置?
請參閱 LabVIEW 8.2 所附的 Reference Object 範例。
labview\examples\lvoop\ReferenceObject\ReferenceObject.lvproj
使用者亦可將類別的專屬資料設為參考。範例將針對該目的,顯示使用單元素 (Single-Element) 佇列參考的方法。亦可使用 GOOP 工具組 (請參閱下列 LabVIEW物件導向程式設計與 GOOP 工具組)。
4. LabVIEW 類別可搭配使用 LabVIEW Real-Time 或任何非桌上型系統嗎?
在 LabVIEW 8.2 中,LabVIEW 類別無法作用 LabVIEW Real-Time 或任何非桌上型系統。
LabVIEW 物件導向程式設計與 GOOP 工具組
1. 何謂 GOOP 工具組?
您可於 NI 網站 免費下載 GOOP 工具組。亦可從 Endevo 購買此工具組的最新版本。
2. 可於 LabVIEW 8.2 中繼續使用 GOOP 嗎?
當然可以!
3. GOOP 與 LabVIEW 物件導向程式設計應如何搭配使用?應如何,並於何時使用 Endevo GOOP 工具組搭配或取代 LabVIEW 物件導向程式設計?
大部分的使用者將發現 LabVIEW 類別可完美作用於應用中。LabVIEW 類別就如同使用者所熟悉的叢集。
亦可使用參考,以處理程式碼區段之間的通訊;該程式碼為平行執行。針對實際模型化系統資源的客戶,參考模型將於建立 GOOP 階層時極有幫助。當建立圖表或樹狀圖時,參考亦十分具有價值。即便在這些案例中,GOOP 階層中心的資料欄位,亦有可能為 LabVIEW 階層。然而,當使用參考,或任何其他溝通平行程式碼的方法時,使用者必須知道有關鎖定 (Locking)、競態條件,與其他可能發生的複雜情況。
亦可使用參考模型,以確定自己不會於記憶體中複製該類別。針對需要許多記憶體的類別,此可為優點。
4. 可否使用 GOOP 工具組將應用轉換為 LabVIEW 物件導向程式設計?目前有何使用 Endevo's GOOP 工具組的客戶應用,可建置於 LabVIEW 物件導向程式設計中?
使用者不需要覆寫現有的 GOOP 類別為 LabVIEW 類別。原因之一,若無必要理由,使用者不應破壞可作用的程式碼;而且 GOOP 類別可繼續作用於 LabVIEW 8.2 與其後的版本。因為 GOOP 工具組是以 LabVIEW 所撰寫。進一步而言,將「依參考 (by-reference)」作用的程式碼,更改為「依數值 (by-value)」的程式碼,是極為浩大的工程。
進行轉換的第二個原因,即為效能。當每個函式必須尋找參考、鎖定實例,並擷取資料時,則將針對物件產生許多開銷。GOOP 工具組即可大幅降低開銷。再更進一步而言,使用參考號碼 (Refnum) 的作業,可避免進行平行處理。如果使用者所擁有的類別,不需要「依參考」,亦不需要較好的效能,則可考慮轉換 GOOP 類別為 LabVIEW 類別。
5. 應如何使用 GOOP,以將應用轉換為 LabVIEW 物件導向程式設計?
此問題必須根據不同的案例,進行不同的解答。LabVIEW 並無法自動進行轉換。
6. LabVIEW 物件導向程式設計與 Endevo GOOP 工具組的效能比較?
由於資料流的一致性,與動態配置的固有編譯器建置(Compiler Implementation),LabVIEW 類別將於相同情況中勝過GOOP 類別。而必須提醒的一點,完全相同的情況卻寥寥可數。LabVIEW 類別是針對取代叢集,並增強資料流所設計。GOOP 類別,為新增參考至 LabVIEW 的方法。在程式語言中,具有 2 個不同的目的。當建立新類別時,使用者應根據類別所需的功能,而非根據預設的效能,來決定 GOOP 類別或 LabVIEW 類別。
技術細節
1. 使用 LabVIEW 類別與叢集 typedef 時,是否會產生效能衝突?
執行電腦範圍的程式檢查時,顯示此兩者的效能幾乎相同。請參閱下列問題,已取得更多效能的相關資訊。
2. 與一般 subVI call 相較,何謂動態 subVI call 的效能耗用 (Performance Overhead)?
當 LabVIEW 尋找所應呼叫的 subVI 時,動態配置的 subVI 將發生小程度的耗用。耗用 (Overhead) 為固定不變。當新增更多類別 (Class) 或新增更多動態 VI 至類別,耗用均不會增加。如果 subVI call 具有參數的額外複本 (Copy),以對應實際 subVI LabVIEW 發送,則有可能發生效能衝突。若要避免衝突,則可於從未嘗試呼叫的動態 VI 中,將輸入人機介面端點接至輸出人機介面端點 (舉例來說,存在的 Parent VI,將僅定義 Children VI 的連線腳位,以進行置換)。請參閱 LabVIEW 物件導向程式設計 (LVOOP):於設計背後所做的決定 白皮書,以了解動態配置是如何達到效能耗用 (Overhead)。
3. LabVIEW 類別函式庫(Class) 與專案函式庫(Project) 有何不同?
LabVIEW 類別 (Class) 為專案函式庫的類型之一。專案函式庫將專屬於作業 (Task),以定義資料類型。如同專案函式庫,LabVIEW 類別將針對 VI 定義圖表與名稱欄位;而 VI 亦將專屬於單一 LabVIEW 類別。
LabVIEW 類別具有專屬的資料控制。此即為定義類別資料值的控制 VI。此特殊控制並不屬於其他函式庫類型的一部分,並實際儲存於類別檔案之中。LabVIEW 類別具有函式庫所擁有的所有屬性,並具有額外屬性。使用者可於繼承 (Inheritance)、探針 (Probe),與接線外觀 (Wire Appearance) 的頁面中,在類別屬性 (Class Properties) 的對話框看到額外屬性。
專案函式庫具有,而 LabVIEW 類別所沒有的唯一功能,即為子函式庫。
4. 使用 LVOOP 時,應於何時載入何類別?
如果 VI 使用 LabVIEW 類別,接著將載入具有類別的 VI,即如 VI 載入自己所有的 subVI。LabVIEW 類別將依序載入所有屬於自己的 VI 與母體類別。母體類別將不會自動觸發載入子類別。母體類別並不具有任何子類別的連結。母體類別所具有的 VI,可能使用子類別,因此 LabVIEW 將載入子類別。
5. 何謂 「依數值 (by-value)」與「依參考 (by-reference)」?其中各所具有的優缺點?
「依數值」意指接線將傳達接線類型的實際資料。「依參考」意指接線傳達類型的參考至資料,而 LabVIEW 將於某中央儲存器 (Central Repository) 儲存實際資料。LabVIEW 中大部分的資料類型,包含數字、陣列、叢集、字串、布林值 (Booleans),與路徑,均依數值排列。一般來說,依參考排列的資料類型,僅限於通訊或反應系統資源的資料,如檔案參考數字 (Refnum)、佇列參考數字,與 VI Server 參考數字。LabVIEW 類別是依數值排列。在依數值排列的語法中,每個物件均擁有自己的資料值,亦可讓使用者針對其他物件個別進行修改。在依參考排列的語法中,將有資料的單一範例成為多重物件的參考。如果單一物件修改了資料,則必須注意不會衝突到其他讀取或寫入資料中的物件。主要的優缺點為:
- 「依數值」在如 LabVIEW 的高度平行環境中較佳,因為可避免競態條件 (Race Condition)。
- 「依數值」可讓編譯器決定複製資料的時間,減輕工程師的壓力。
- 「依參考」可讓工程師進行配置;針對單一範例資源與大型資料集,則為較佳的模型。
6. 為什麼 LabVIEW 物件導向程式設計 (LVOOP) 為「依數值」?
請參閱 LabVIEW 物件導向程式設計 (LVOOP):於設計背後所做的決定. 白皮書。
7. NI 是否提供可建立/管理 LabVIEW 類別 (Class) 的 UML 工具?
NI 並未提供 UML 工具。Endevo 提供從 UML 圖表產生類別的工具,並可從程式碼產生 UML 圖表。工具目前可作用於 GOOP 類別 (請參閱上列的 LabVIEW 物件導向與 GOOP 工具組),但下一版本亦將支援 LabVIEW 類別。
8. 為何我無法於 LabVIEW 類別控制與指示器中,使用「將現有值設為預設值 (Make Current Value Default)」?為何我無法設定 LabVIEW 物件導向程式設計的常數值?
將現有值設為預設值為 LabVIEW 的強大功能之一。使用者可能常常使用該值以建立 VI。因為使用者介面的複雜度關係,此功能並不支援 LabVIEW 8.2 中的 LabVIEW 類別。因此就算使用者無法實際看到私有資料,亦可知道預設值以外的資料。未來的 LabVIEW 版本將第一優先新增此功能。
9. 為何無法進行動態 VI 重入碼 (Reentrant)?
更多資源
1. LabVIEW 物件導向程式設計 (LVOOP):於設計背後所做的決定白皮書。
2. NI Week 2006 Presentation:物件導向開發的介紹
請將檔案解壓縮,並開啟 PowerPoint。已包含的 VI 將參照該 PowerPoint 所提及。
3. NI Week 2006 Presentation:LabVIEW 中的物件導向設計
請將檔案解壓縮,並開啟 PowerPoint。已包含的 VI 將參照該 PowerPoint 所提及。
合法
此教學由美商國家儀器 (以下簡稱 NI) 開發。此教學受 NI 技術支援,但未經完整測試及檢驗。NI 不保證品質,亦不為其更新版本、相關產品及驅動程式等後續支援負責。此教學不具任何形式保證,且不受任何特定用途規範。(http://ni.com/legal/termsofuse/unitedstates/us/)
