什么是 C 語言面向對象?
在開始嵌入式 C 語言設計模式系列文章之前,先通過三篇文章講述了如何使用?C??語言實現(xiàn)面向對象的三大特性,封裝,繼承,多態(tài)。
對于“面向對象”這個詞語,相信很多軟件工程師都不會感覺到陌生,并且很多軟件工程師在剛開始學習編程的時候,講師一般都會跟我們講,C?語言是一門面向過程的語言,而?C++,Java,Python,Go?等高級語言,才是主流的面向對象語言。
那到底什么是“面向過程”,什么是“面向對象”呢?關于這兩者的概念,我相信網(wǎng)絡上并不缺少相關的信息,這里也不再復制粘貼網(wǎng)上的概念介紹。
舉幾個例子:
例子1:
客戶:“我需要一份蛋炒飯”。
面向過程:先把飯煮好,點火起鍋燒油,雞蛋先放,炒好撈出,再起鍋燒油,瘦肉豆芽胡蘿卜絲翻炒半熟撈出,刷鍋起鍋燒油,倒入米飯。。。。一頓操作猛如虎。
面向對象:蛋炒飯有米飯,雞蛋瘦肉豆芽胡蘿卜絲,需要花生油,炒鍋,等等工具,需要廚師,需要。。。。
例子2:
客戶:“我需要一輛自行車”。
面向過程:先把自行車的機架車身電焊,上油漆,再安裝前后兩個車轱轆,安裝剎車,安裝停車支架,安裝扶手,安裝坐墊,安裝籃子。。。
面向對象:自行車有機架車身,有車轱轆,有剎車,有停車支架,有扶手,有坐墊,有籃子,剎車用來剎車(這話有點廢,哈哈哈),車轱轆用來行走。。。
例子3:
客戶:“我需要一架航天飛機”。
面向過程:先找來一些耐高溫耐輻射的航天級工業(yè)材料,用來打造航天飛機的機身,機身主要分為前段機身、中段機身和后段機身,各段機身打造完成后,開始設計機身內部航天員活動空間,然后再設計主發(fā)動機和軌道控制發(fā)動機,然后再。。。。(編不下去了)
面向對象:找NASA。(開玩笑,哈哈哈哈)
如上面三個(其實是前兩個)例子所述,面向過程主要思考的是“如何(HOW)”的問題,也就是把一個目標,拆分為多個流程環(huán)節(jié),然后把每個流程環(huán)節(jié)拼湊起來,最終實現(xiàn)客戶想要的目標。
而面向對象,主要思考的是“什么(WHAT)”的問題,面向對象會先把一句具體的目標拆分,目標里面包含什么,每一個“什么”各自能完成哪些功能,把這些一個個的“什么”拼湊起來,就可以實現(xiàn)客戶想要的目標。
面向過程的思維,和面向對象的思維,有著本質上的區(qū)別,一直從事嵌入式開發(fā)的工程師,特別是單片機工程師,在面對銷售業(yè)務提出的需求或者疑問的時候,多數(shù)都是采用面向過程而非面向對象的思維方式進行思考。
也就是說,單片機工程師第一反應,是想著“如何(HOW)”去解決業(yè)務端的需求,而不是去深挖這個需求的本質是“什么(WHAT)”。
很多嵌入式C語言的入門教程,以及網(wǎng)絡上大多數(shù)的開發(fā)示例,都是用“HOW”的思維方式去告訴我們怎么解決一個問題,很少用“WHAT”的思維去讓工程師們思考問題的本質。
(注意:這里并不是在否定面向過程的優(yōu)勢之處?。?/strong>
“HOW”的思維模式跟 C 語言的語法有著很大的關系,因為基于 C 語言的語法實現(xiàn)面向對象,會繞一些彎路,C 語言的語法沒有面向對象的語法糖支持,所以用 C 語言實現(xiàn)面向對象會有一定的困難。
但往往在一些業(yè)務復雜的場景下,使用“WHAT”的思維比使用“HOW”的思維更加湊效,更能反映問題的本質,再往更深層次的思考,就會去到“WHY”的層面了。
編程語言只是一種工具,而“面向對象”和“面向過程”是兩種編程思想,編程思想會指導嵌入式工程師如何使用程序語言工具,這就是 C 語言和面向對象的本質。
為什么要用 C語言面向對象?
既然面向對象是一種編程思想,而編程語言只是一種工具,那么,思想與工具之間就不存在一種強耦合的關系,C++可以面向對象,Java可以面向對象,C 語言同樣可以面向對象。
現(xiàn)在很多嵌入式設備的處理器,都可以支持使用 C++ 語言進行開發(fā),但對于以往慣用的開發(fā)方式,嵌入式設備還是用 C 語言開發(fā)居多。
一些業(yè)務簡單,邏輯不復雜的嵌入式設備或嵌入式軟件模塊,其實是可以直接使用“面向過程”的思維模式去進行開發(fā),這樣最直接高效,對于初學者,也建議用“HOW”的方式去進行入門。
而一些復雜的業(yè)務場景,比如,操作系統(tǒng)內核,協(xié)議棧,通用的驅動模塊,等等,就不得考慮使用面向對象“WHAT”的思維方式去思考和設計了。
因為像操作系統(tǒng)、協(xié)議棧這些復雜的業(yè)務模塊,所面對的場景是很豐富而且很復雜的,面向過程的思維就會讓這些業(yè)務模塊在設計和使用的時候受限。
這些運行在嵌入式設備里面的業(yè)務模塊,為了執(zhí)行效率,通常都是用 C 語言進行開發(fā)的,所以,就不得不用C語言進行面向對象開發(fā)。
關于C 語言面向對象的爭議
用?C?語言進行面向對象開發(fā),在嵌入式工程師群體里面,一直都存在著爭議,并且這個爭議維持了很長一段時間,都沒有得出正確的結論,并且群里面的小伙伴有時候會為這個話題爭論得面紅耳赤。
有些工程師認為,既然嵌入式設備要進行面向對象設計,為啥不用?C++?語言,或者用?Rust?語言,這些語言豈不是支持更多面向對象的語法特性,因為這些語言的語法支持面向對象,使用起來豈不是更加簡單?
也有一些工程師認為,既然一些規(guī)模比較大的芯片廠家提供的?SDK,基本上都是使用面向對象進行框架設計,還有世界上最優(yōu)秀的開源操作系統(tǒng)?Linux,里面也大量使用了?C?語言面向對象來設計驅動框架,
那么,作為嵌入式軟件工程師,并且主要使用的編程語言是?C?語言,就更需要學習如何使用?C?語言面向對象的方式,去應對復雜龐大的業(yè)務需求,設計出高彈性可擴展的業(yè)務框架。
筆者認為,不管“面向過程”還是“面向對象”,不管是?C?語言還是其他高級語言,其本質都是解決業(yè)務問題的工具,除了要學習如何使用這些工具,還需要學習如何選擇合適的工具去解決特定的問題。
編程思維沒有高低優(yōu)劣之分,編程語言更是如此,因為這些編程思維和編程工具,都是在特定場景下,解決特定問題的工具。
網(wǎng)絡上經(jīng)常會看到很多人拿?C?語言去跟其他語言比較,說某某語言將會被淘汰,不建議再學習,某某語言天下第一YYDS,等等。
且不說是不是有人別有用心,為了噱頭而拋出這些話題,光是這種片面的對比,就知道這些人的論點和論據(jù)過于片面而經(jīng)不起事實的推敲,參與這些話題的爭論,最終只會浪費自己的時間。
最后,本系列文章需要強調一個基本原則,就是:不是所有使用C語言開發(fā)的嵌入式軟件,都一定要用面向對象的思維進行編碼指導,也并不是否定C語言面向過程開發(fā)的優(yōu)勢之處。一名優(yōu)秀的嵌入式軟件工程師,需要學會根據(jù)實際的項目情況,合理地選擇編程語言和編程思維,才能創(chuàng)造出穩(wěn)定可靠,高內聚低耦合,高彈性易擴展的應用軟件。