全網最適合入門的面向對象編程教程:00 面向對象設計方法導論

来源:https://www.cnblogs.com/FreakEmbedded/p/18264202
-Advertisement-
Play Games

主要對面向過程編程與面向對象編程進行對比,介紹了軟體危機的背景,講解了面向對象編程設計思想的由來,對面向對象方法學:OOA-OOD-OOP進行簡單介紹。 ...


全網最適合入門的面向對象編程教程:00 面向對象設計方法導論

1.1 面向過程編程與面向對象編程 OOP

在嵌入式開發中,我們往往使用 C 語言進行編程,將待完成的問題看作一系列需要完成的任務,函數則用於完成這些任務,解決問題的焦點集中於函數,這就是所謂的面向過程編程。

與之相對的是面向對象編程,它把對象作為程式的基本單元,一個對象包含了數據和操作數據的函數,相同屬性和操作方法的對象被抽象為類。以在工業製造上,使用模具來鑄造機殼和零件為例,類就是模具,而對象就是使用模具生產出的零件,即類的實例。

以把大象裝進冰箱為例,二者區別如下圖所示:

image

1.2 軟體危機與 OOP 思想的提出

**“史前時期最駭人的景象,莫過於一群巨獸在焦油坑裡做垂死前的掙扎。不妨閉上眼睛想像一下,你看到了一群恐龍、長毛象、劍齒虎正在奮力掙脫焦油的束縛,但越掙扎,焦油就纏得越緊,就算他再強壯、再厲害,最後,都難逃滅頂的命運。過去十年間,大型系統的軟體開發工作就像是掉進了焦油坑裡…… ” **
——佛瑞德·布魯克斯

早期的編程語言,如彙編語言、只有 0 和 1 的機器語言,本質上是面向機器編程。他們開始認為編程的設計應該符合人類習慣和邏輯思維的語句,如 add 用於加法運算、sub 用於除法運算、cmp 用於比較兩個數的大小。

但 CPU 指令集(彙編語言)還是比較抽象,人們有了一個自然的需求,能不能按照人容易理解的思維寫程式後把寫出來的程式自動翻譯成機器語言呢?後來,電腦科學家們發現所有程式可以化為三種結構構成:順序結構、分支結構和迴圈結構。

Fortran、C 等所謂的高級編程語言便應運而生,這樣的語言關註邏輯處理過程,在面對編程問題時,往往採用結構化範型來完成軟體開發,人們將軟體的生存周期分為需求分析、總體設計、詳細設計、編程和測試幾個階段,強調系統的模塊結構,以及模塊的劃分,模塊間的數據傳送及調用關係。

然而隨著軟體需求的快速增長,面向過程的設計方法使得大型軟體更容易被設計成麵條式程式,長長的過程調用執行,像一根麵條。大型項目最後由這樣一根一根麵條組成,就成了一個毛線團,變得難以維護和修改。

image

1968 年,北大西洋公約組織(NATO)在聯邦德國的國際學術會議創造軟體危機(Software crisis)一詞。而 1960 年代中期開始爆發眾所周知的軟體危機,為瞭解決問題,在 1968、1969 年連續召開兩次著名的 NATO 會議,並同時提出軟體工程的概念。1972 年,艾茲赫爾·戴克斯特拉於電腦協會圖靈獎的演講:

軟體危機的主要原因,把它很不客氣地說:在沒有機器的時候,編程根本不是問題;當我們有了電腦,編程開始變成問題;而現在我們有巨大的電腦,編程就成為了一個同樣巨大的問題。
—艾茲赫爾·戴克斯特拉,《Communications of the ACM》

image

軟體危機使人們認識到中大型軟體系統與小型軟體有著本質性差異:

  • 大型軟體系統開發周期長、費用昂貴、軟體質量難以保證、生產率低,它們的複雜性已遠超出人腦能直接控制的程度;
  • 大型軟體系統不能沿襲工作室的開發方式,就像製造小木船的方法不能生產航空母艦一樣。
    image

軟體的存在已經有數十年的歷史了,一直到了 1980 年代的面向對象技術才解決了一部分在軟體危機上的窘境。人們開始重新審視軟體編程這件事情的本質,除了一部分科學計算或者其他特定目的的軟體,大部分的軟體是為瞭解決現實世界的問題,企業的庫存管理、銀行的賬務處理等等。所以,軟體編程的本質是程式員用代碼的方式使現實世界的事務運行在電腦上,電腦軟體是為瞭解決現實世界的問題而開發出來的,那麼軟體編程這件事情應該關註的重點是客觀世界的事物本身,而不是程式員的思維方式或者電腦的指令。

如果軟體編程的重點是客觀世界的事物本身,那麼編程語言如何才能更好地滿足這一需求?面向對象編程應運而生,它提出一切皆對象,客觀世界的用戶、賬號、商品是對象;創建、組合、關聯這些對象的工廠、適配器、觀察者也是對象;將所有這些對象分析、設計、開發出來,一個軟體系統就完成了,這個軟體系統靈活、強大,最重要的是可以根據需求變化快速更新維護。

1.3 面向對象方法學

面向對象方法學是一種把面向對象的思想應用於軟體開發過程中,指導開發活動的系統方法,是建立在“對象”概念基礎上的方法學。對於面向對象方法學,它把軟體開發分為分析、設計和編程三個不同階段。

1.3.1 面向對象分析(OOA)

OOA 面向對象分析方法指的是在一個系統的開發過程中進行了系統業務調查以後,按照面向對象的思想來分析問題,並確定所需的對象及對象之間的交互關係。分析階段關註的是需要完成什麼,分析階段的輸出是一系列需求。

1.3.2 面向對象設計(OOD)

面向對象設計(OOD)就是在 OOA 模型的基礎上運用面向對象方法進行系統設計,是將這些需求轉化為實現方案的過程。設計者必須命名對象,定義其行為,指定哪些對象可以針對其他對象實施指定的行為。設計階段關註的是如何完成。設計階段的輸出是實現方案。

1.3.3 面向對象編程(OOP)

面向對象編程(OOP)是將完美定義的設計轉化為可以運行程式的過程,即用具體的數據結構來定義對象的屬性,用具體的語句來實現服務流程圖所表示的演算法。OOP 階段產生的程式能夠緊密地對應 OOD 模型。

image

文檔獲取

可訪問如下鏈接進行對文檔下載:

https://github.com/leezisheng/Doc

image
本文檔主要介紹如何使用 Python 進行面向對象編程,需要讀者對 Python 語法和單片機開發具有基本瞭解。相比其他講解 Python 面向對象編程的博客或書籍而言,本文檔更加詳細、側重於嵌入式上位機應用,以上位機和下位機的常見串口數據收發、數據處理、動態圖繪製等為應用實例,同時使用 Sourcetrail代碼軟體對代碼進行可視化閱讀便於讀者理解。

關於文檔的更多介紹可看:
學嵌入式的你,還不會面向對象??!

相關示例代碼獲取鏈接如下:

https://github.com/leezisheng/Python-OOP-Demo

image

image


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 你不知道的 CSS 之包含塊 一說到 CSS 盒模型,這是很多小伙伴耳熟能詳的知識,甚至有的小伙伴還能說出 border-box 和 content-box 這兩種盒模型的區別。 但是一說到 CSS 包含塊,有的小伙伴就懵圈了,什麼是包含塊?好像從來沒有聽說過這玩意兒。 好吧,如果你對包含塊的知識一 ...
  • 作為一名前端開發者,vscode想必大家應該都接觸過,就像大多數 IDE 一樣,VSCode 也有一個擴展和主題市場,包含了數以千計質量不同的插件。 作為一名熟練掌握各種前端開發工具安裝和卸載的大師兄來說,為大家安利好玩有用的工具插件是我義不容辭的責任,所以我精挑細選了九款必備的vscode插件 C ...
  • ‍ 寫在開頭 點贊 + 收藏 學會 需求背景 從第三方採購的vue2 + ElementUI實現的雲管平臺,乙方說2011年左右就開始有這個項目了(那時候有Vue了嗎,思考.jpg)。十幾年的項目,我何德何能可以擔此責任。裡面的代碼經過多人多年迭代可以用慘不忍睹來形容,吐槽歸吐槽 ...
  • 摘要:本文深入探討了Nuxt 3的組件開發與管理,從基礎概念、安裝配置、目錄結構、組件分類與開發實踐、生命周期與優化,到測試與維護策略。詳細介紹了Nuxt 3的核心特點,如伺服器端渲染(SSR)、靜態站點生成(SSG)以及與Vue生態系統的無縫集成。文章以Nuxt 3為基礎,指導開發者如何高效構建高... ...
  • 問題分析 當我們需要用摺疊面板的時候,往往會考慮element-ui的el-collaspe,然而大多數時候原生預設的樣式並無法拿來就用。我們往往會自定義組件的樣式,或者在預設的基礎上進行修改。最近在Vue項目中進行組件修改的時候,無意間某個文件自動設置成了scoped(應該是插件自動化生成的結構代 ...
  • 前言 眾所周知,在vue2的時候使用一個vue組件要麼全局註冊,要麼局部註冊。但是在setup語法糖中直接將組件import導入無需註冊就可以使用,你知道這是為什麼呢?註:本文中使用的vue版本為3.4.19。 關註公眾號:【前端歐陽】,給自己一個進階vue的機會 看個demo 我們先來看個簡單的d ...
  • CSS 屬性計算過程 你是否瞭解 CSS 的屬性計算過程呢? 有的同學可能會講,CSS屬性我倒是知道,例如: p{ color : red; } 上面的 CSS 代碼中,p 是元素選擇器,color 就是其中的一個 CSS 屬性。 但是要說 CSS 屬性的計算過程,還真的不是很清楚。 沒關係,通過此 ...
  • ‍ 寫在開頭 點贊 + 收藏 學會 前端常用的截圖保存的方法 利用 Blob 對象和 URL.createObjectURL:可以將截圖數據轉換為 Blob 對象,然後使用 URL.createObjectURL 方法生成一個臨時的 URL,將這個 URL 賦值給 <a> 標簽的 ...
一周排行
    -Advertisement-
    Play Games
  • 問題 有很多應用程式在驗證JSON數據的時候用到了JSON Schema。 在微服務架構下,有時候各個微服務由於各種歷史原因,它們所生成的數據對JSON Object屬性名的大小寫規則可能並不統一,它們需要消費的JSON數據的屬性名可能需要大小寫無關。 遺憾的是,目前的JSON Schema沒有這方 ...
  • 首先下載centos07鏡像,建議使用阿裡雲推薦的地址: https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spm=a2c6h.25603864.0.0.59b5f5ad5Nfr0X 其實這裡就已經出現第一個坑了 centos 07 /u ...
  • 相信很多.NETer看了標題,都會忍不住好奇,點進來看看,並且順便準備要噴作者! 這裡,首先要申明一下,作者本人也非常喜歡Linq,也在各個項目中常用Linq。 我愛Linq,Linq優雅萬歲!!!(PS:順便吐槽一下,隔壁Java從8.0版本推出的Streams API,抄了個四不像,一點都不優雅 ...
  • 在人生的重要時刻,我站在了畢業的門檻上,望著前方的道路,心中涌動著對未來的無限憧憬與些許忐忑。面前,兩條道路蜿蜒伸展:一是繼續在職場中尋求穩定,一是勇敢地走出一條屬於自己的創新之路。儘管面臨年齡和現實的挑戰,我仍舊選擇勇往直前,用技術這把鑰匙,開啟新的人生篇章。 迴首過去,我深知時間寶貴,精力有限。 ...
  • 單元測試 前言 時隔多個月,終於抽空學習了點新知識,那麼這次來記錄一下C#怎麼進行單元測試,單元測試是做什麼的。 我相信大部分剛畢業的都很疑惑單元測試是乾什麼的?在小廠實習了6個月後,我發現每天除了寫CRUD就是寫CRUD,幾乎用不到單元測試。寫完一個功能直接上手去測,當然這隻是我個人感受,僅供參考 ...
  • 一:背景 1. 講故事 最近在分析dump時,發現有程式的卡死和WeakReference有關,在以前只知道怎麼用,但不清楚底層邏輯走向是什麼樣的,藉著這個dump的契機來簡單研究下。 二:弱引用的玩法 1. 一些基礎概念 用過WeakReference的朋友都知道這裡面又可以分為弱短和弱長兩個概念 ...
  • 最近想把ET打表工具的報錯提示直接調用win系統彈窗,好讓策劃明顯的知道表格哪裡填錯數據,彈窗需要調用System.Windows.Forms庫。操作如下: 需要在 .csproj 文件中添加: <UseWindowsForms>true</UseWindowsForms> 須將目標平臺設置為 Wi ...
  • 從C#3開始,拓展方法這一特性就得到了廣泛的應用。 此功能允許你能夠使用實例方法的語法調用某個靜態方法,以下是一個獲取/創建文件的靜態方法: public static async Task<StorageFile> GetOrCreateFileAsync(this StorageFolder f ...
  • 在Windows 11下,使用WinUI2.6以上版本的ListView長這樣: 然而到了Win10上,儘管其他控制項的樣式沒有改變,但ListViewItem變成了預設樣式(初代Fluent) 最重大的問題是,Win10上的HorizontalAlignment未被設置成Stretch,可能造成嚴重 ...
  • 前言 周六在公司加班,幹完活後越顯無聊,想著下載RabbiitMQ做個小項目玩玩。然而這一下就下載了2個小時,真讓人頭痛。 簡單的講一下如何安裝吧,網上教程和踩坑文章還是很多的,我講我感覺有用的文章放在本文末尾。 安裝地址 erlang 下載 - Erlang/OTP https://www.erl ...