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