全網最適合入門的物件導向程式設計教程:00 物件導向設計方法導論
1.1 程序導向程式設計與物件導向程式設計 OOP
在嵌入式開發中,我們往往使用 C 語言進行程式設計,將待完成的問題看作一系列需要完成的任務,函式則用於完成這些任務,解決問題的焦點集中於函式,這就是所謂的程序導向程式設計。
與之相對的是物件導向程式設計,它把物件作為程式的基本單元,一個物件包含了資料和運算元據的函式,相同屬性和操作方法的物件被抽象為類。以在工業製造上,使用模具來鑄造機殼和零件為例,類就是模具,而物件就是使用模具生產出的零件,即類的例項。
以把大象裝進冰箱為例,二者區別如下圖所示:
1.2 軟體危機與 OOP 思想的提出
**“史前時期最駭人的景象,莫過於一群巨獸在焦油坑裡做垂死前的掙扎。不妨閉上眼睛想像一下,你看到了一群恐龍、長毛象、劍齒虎正在奮力掙脫焦油的束縛,但越掙扎,焦油就纏得越緊,就算他再強壯、再厲害,最後,都難逃滅頂的命運。過去十年間,大型系統的軟體開發工作就像是掉進了焦油坑裡…… ” **
——佛瑞德·布魯克斯
早期的程式語言,如組合語言、只有 0 和 1 的機器語言,本質上是面向機器程式設計。他們開始認為程式設計的設計應該符合人類習慣和邏輯思維的語句,如 add 用於加法運算、sub 用於除法運算、cmp 用於比較兩個數的大小。
但 CPU 指令集(組合語言)還是比較抽象,人們有了一個自然的需求,能不能按照人容易理解的思維寫程式後把寫出來的程式自動翻譯成機器語言呢?後來,電腦科學家們發現所有程式可以化為三種結構構成:順序結構、分支結構和迴圈結構。
Fortran、C 等所謂的高階程式語言便應運而生,這樣的語言關注邏輯處理過程,在面對程式設計問題時,往往採用結構化範型來完成軟體開發,人們將軟體的生存週期分為需求分析、總體設計、詳細設計、程式設計和測試幾個階段,強調系統的模組結構,以及模組的劃分,模組間的資料傳送及呼叫關係。
然而隨著軟體需求的快速增長,程序導向的設計方法使得大型軟體更容易被設計成麵條式程式,長長的過程呼叫執行,像一根麵條。大型專案最後由這樣一根一根麵條組成,就成了一個毛線團,變得難以維護和修改。
1968 年,北大西洋公約組織(NATO)在聯邦德國的國際學術會議創造軟體危機(Software crisis)一詞。而 1960 年代中期開始爆發眾所周知的軟體危機,為了解決問題,在 1968、1969 年連續召開兩次著名的 NATO 會議,並同時提出軟體工程的概念。1972 年,艾茲赫爾·戴克斯特拉於計算機協會圖靈獎的演講:
軟體危機的主要原因,把它很不客氣地說:在沒有機器的時候,程式設計根本不是問題;當我們有了計算機,程式設計開始變成問題;而現在我們有巨大的計算機,程式設計就成為了一個同樣巨大的問題。
—艾茲赫爾·戴克斯特拉,《Communications of the ACM》
軟體危機使人們認識到中大型軟體系統與小型軟體有著本質性差異:
- 大型軟體系統開發週期長、費用昂貴、軟體質量難以保證、生產率低,它們的複雜性已遠超出人腦能直接控制的程度;
- 大型軟體系統不能沿襲工作室的開發方式,就像製造小木船的方法不能生產航空母艦一樣。
軟體的存在已經有數十年的歷史了,一直到了 1980 年代的物件導向技術才解決了一部分在軟體危機上的窘境。人們開始重新審視軟體程式設計這件事情的本質,除了一部分科學計算或者其他特定目的的軟體,大部分的軟體是為了解決現實世界的問題,企業的庫存管理、銀行的賬務處理等等。所以,軟體程式設計的本質是程式設計師用程式碼的方式使現實世界的事務執行在計算機上,計算機軟體是為了解決現實世界的問題而開發出來的,那麼軟體程式設計這件事情應該關注的重點是客觀世界的事物本身,而不是程式設計師的思維方式或者計算機的指令。
如果軟體程式設計的重點是客觀世界的事物本身,那麼程式語言如何才能更好地滿足這一需求?物件導向程式設計應運而生,它提出一切皆物件,客觀世界的使用者、賬號、商品是物件;建立、組合、關聯這些物件的工廠、介面卡、觀察者也是物件;將所有這些物件分析、設計、開發出來,一個軟體系統就完成了,這個軟體系統靈活、強大,最重要的是可以根據需求變化快速更新維護。
1.3 物件導向方法學
物件導向方法學是一種把物件導向的思想應用於軟體開發過程中,指導開發活動的系統方法,是建立在“物件”概念基礎上的方法學。對於物件導向方法學,它把軟體開發分為分析、設計和程式設計三個不同階段。
1.3.1 物件導向分析(OOA)
OOA 物件導向分析方法指的是在一個系統的開發過程中進行了系統業務調查以後,按照物件導向的思想來分析問題,並確定所需的物件及物件之間的互動關係。分析階段關注的是需要完成什麼,分析階段的輸出是一系列需求。
1.3.2 物件導向設計(OOD)
物件導向設計(OOD)就是在 OOA 模型的基礎上運用物件導向方法進行系統設計,是將這些需求轉化為實現方案的過程。設計者必須命名物件,定義其行為,指定哪些物件可以針對其他物件實施指定的行為。設計階段關注的是如何完成。設計階段的輸出是實現方案。
1.3.3 物件導向程式設計(OOP)
物件導向程式設計(OOP)是將完美定義的設計轉化為可以執行程式的過程,即用具體的資料結構來定義物件的屬性,用具體的語句來實現服務流程圖所表示的演算法。OOP 階段產生的程式能夠緊密地對應 OOD 模型。
文件獲取
可訪問如下連結進行對文件下載:
https://github.com/leezisheng/Doc
本文件主要介紹如何使用 Python 進行物件導向程式設計,需要讀者對 Python 語法和微控制器開發具有基本瞭解。相比其他講解 Python 物件導向程式設計的部落格或書籍而言,本文件更加詳細、側重於嵌入式上位機應用,以上位機和下位機的常見串列埠資料收發、資料處理、動態圖繪製等為應用例項,同時使用 Sourcetrail程式碼軟體對程式碼進行視覺化閱讀便於讀者理解。
關於文件的更多介紹可看:
學嵌入式的你,還不會物件導向??!
相關示例程式碼獲取連結如下:
https://github.com/leezisheng/Python-OOP-Demo