面向對象程式設計(OOP)是一項功能強大的程式設計技術,使用得當時能夠讓我們的程式實作更好的子產品化封裝、代碼高内聚、低耦合,并讓程式易于擴充,便于維護,進而大大提升開發效率和降低維護成本。
LabVIEW于2006年的LabVIEW 8.2版本開始推出面向對象程式設計範型,在LabVIEW 曆次版本釋出中,不斷疊代,逐漸更新,并在LabVIEW 2020版本中推出接口(Interface)最新功能,使得LabVIEW的面向對象程式設計功能日趨完善。
但是,強大的程式設計武器需要經過艱苦的學習才能掌握,特别是沒有人指點的自學,更是難上加難!今天我就和大家說道說道:我剛開始學LabVIEW面向對象程式設計時犯得四個錯誤。
首先,是類爆炸的問題
就是偏好把什麼都當成了類,造成了過多的、不必要的類,典型的一個不必要的類,就是除了設定Setter和擷取Getter方法外,就沒有其它特别需要處理的方法,這就是犯了”把資料類型直接當作了類“的錯誤。
實際上,類是資料類型和功能單元方法的聯合體,更應該強調功能方法的作用,資料類型是作為方法内部實作計算和暫存狀态的資料容器。另外,從功能方法上劃分上,需要更加聚焦,适當的歸并聚集一下,進而降低瑣碎的小類的數量。
其次,抽象的本質含義了解不透徹
LabVIEW中的類(lvclass),包括LabVIEW 2020版本引入的接口(Inteface)概念,都是用來抽象和封裝相關程式設計裡的單元元素概念的。而單元元素概念,有時候是和現實實體實體概念映射是一緻的,這時候就比較好抽象程式設計。
在入門級别的面向對象程式設計圖書中,為了小白好了解和降低認知門檻,也是多是使用這些生活中的實際物體和伴随場景(諸如:汽車、手機)來舉例示範說明類封裝。但是,該方式也讓初學者忽視了面向對象程式設計中的類抽象封裝,多數還是針對純程式設計元素的概念。如測試檔案資料的儲存、資料庫伺服器的操作、界面顯示單元等等。針對這些程式設計概念的合理抽象封裝,可以更好的實作對具體變化支援,也是針對抽象程式設計本質,進而實作面向對象程式設計中的開閉(OCP)原則效果。
第三、在設計模式上誤入歧途
初學者在了解面向對象程式設計的抽象、封裝、繼承和多态程式設計基礎知識後,不可避免的就會接觸到面向對象設計模式(Design Pattern),我自己也在設計模式認知和學習過程上反複過好多回。
初學者最容易犯的一個錯誤就把面向對象的設計模式讀死,以為了解一下概念,學習一下範例,就可以在設計模式中輕松的應用起來。實則不然,設計模式本質是針對某個特殊的開發場景,使用面向對象程式設計技術給出的建議固定套路設計方案,而這種設計方案在程式開發整體中是片段化、可組合的,并且其核心内涵就是SOLID設計原則。
我個人的的建議:就是快速大緻的了解一下相關簡易的設計模式(政策、擴充卡、工廠等)概念後,不要刻意在自己的程式中去采用設計模式,而是應該更加注重SOLID設計原則的應用,在實施設計原則設計過程中,不斷的疊代重構更新程式,不知不覺中,你就會發現自己的程式較為符合SOLID設計原則時,或多或少都已經實作了若幹個設計模式。
等入了設計模式的門後,再有意識地強化學習一下難度大的設計模式(橋接、通路者、指令者、狀态),再結合一下LabVIEW的經典架構(Actor Framework )的源碼閱讀,掌握具體的設計模式在應用程式中的開發應用。
最後,與衆不同的LabVIEW面向對象實作
LabVIEW的面向對象,從嚴格意義上講,是完全符合經典的面向對象程式設計概念的,特别是後期的消息驅動的操作者架構(Actor Framework)。但是為了符合LabVIEW的圖形資料流、天然多線程的程式設計特質,LabVIEW的類定義實作為傳值(By-Value)拷貝傳遞的方式。
傳值方式和其它主流的面向對象文本程式設計語言(如Java、C++、C#)傳引用有着顯著的不同。另外,為了相容性LabVIEW 開發者的使用習慣,在一些概念術語上并沒有約定成俗的遵循正常套路。
但是LabVIEW的面向對象程式設計技能的教育訓練與教育,又完全離不開其它文本程式設計語言的各種經典内容。是以,LabVIEW的面向對象主設計師、程式設計大神Stephen Loftus-Mercer特意寫了兩篇關于LabVIEW面向對象程式設計的設計決策技術白皮書,讓從其它語言OO知識過渡過來的開發者,深入了解這之間的差異性,進而更好的适配LabVIEW程式設計語言。
對這兩篇技術白皮書感興趣的同學請移步至知乎進行搜尋檢視。
另外,我把自己摸索學習LVOOP程式設計過程,寫成了一系列的學習文章,這就是《LabVIEW面向對象程式設計_初窺門檻》系列程式設計文章的由來,如果感興趣,可以去看看我的知乎個人首頁中置頂彙總文章的第五章節的具體連結指向。
最後,希望大家都能夠在學習LabVIEW面向對象程式設計道路上少走彎路,快速成長!