日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++代碼需要遵循的10個(gè)最佳實(shí)踐

CPP開發(fā)者 ? 來源:DeepNoMind ? 作者:俞凡 ? 2022-10-18 15:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

C++代碼提供了足夠的靈活性,因此對(duì)于大部分工程師來說都很難把握。本文介紹了寫好C++代碼需要遵循的10個(gè)最佳實(shí)踐,并在最后提供了一個(gè)工具可以幫助我們分析C++代碼的健壯度。

1. 盡可能嘗試使用新的C++標(biāo)準(zhǔn)

到2022年,C++已經(jīng)走過了40多個(gè)年頭。新的C++標(biāo)準(zhǔn)實(shí)際上簡(jiǎn)化了許多令人沮喪的細(xì)節(jié),提供了新的現(xiàn)代方法來改進(jìn)C++代碼,但讓開發(fā)人員認(rèn)識(shí)到這一點(diǎn)并不容易。

以內(nèi)存管理為例,這可能是C++中受到最多批評(píng)的機(jī)制。多年來,對(duì)象分配都是由new關(guān)鍵字完成的,開發(fā)人員一定得記住在代碼的某個(gè)地方調(diào)用delete?!艾F(xiàn)代C++”解決了這個(gè)問題,并促進(jìn)了共享指針的使用。

2. 使用命名空間模塊化代碼

現(xiàn)代C++庫(kù)廣泛使用命名空間來模塊化代碼庫(kù),它們利用“Namespace-by-feature”方法,按功能劃分命名空間來反映功能集,將單個(gè)特性(且僅與該特性)相關(guān)的所有內(nèi)容放到單個(gè)命名空間中。從而使得命名空間具有高內(nèi)聚性和高模塊化,并且耦合最小,緊耦合的項(xiàng)目被放在了一起。

Boost是按特性分組的最佳示例,其包含數(shù)千個(gè)命名空間,每個(gè)命名空間用于對(duì)特定的特性進(jìn)行分組。

3. 抽象

數(shù)據(jù)抽象是C++中面向?qū)ο?a target="_blank">編程最基本和最重要的特性之一。抽象意味著只顯示基本信息而隱藏細(xì)節(jié),數(shù)據(jù)抽象指的是僅向外部世界提供關(guān)于數(shù)據(jù)的基本信息,隱藏背景細(xì)節(jié)或?qū)崿F(xiàn)。

盡管許多書籍、網(wǎng)絡(luò)資源、會(huì)議演講者和專家都推薦這種最佳實(shí)踐,但在很多項(xiàng)目中,這條規(guī)則仍然被忽略了,許多類的細(xì)節(jié)并沒有被隱藏。

4. 類越小越好

具有多行代碼的類型應(yīng)該被劃分為一組較小的類型。

需要很大的耐心重構(gòu)一個(gè)大的類,甚至可能需要從頭重新創(chuàng)建所有東西。以下是一些重構(gòu)建議:

BigClass中的邏輯必須被分成更小的類。這些較小的類最終可能成為嵌套在原始God Class中的私有類,God Class的實(shí)例對(duì)象由較小嵌套類的實(shí)例組成。

較小的類劃分應(yīng)該由God Class負(fù)責(zé)的多個(gè)職責(zé)驅(qū)動(dòng)。要確定這些職責(zé),通常需要查找與字段的子集強(qiáng)耦合的方法的子集。

如果BigClass包含的邏輯比狀態(tài)多,一個(gè)好的選擇是定義一個(gè)或幾個(gè)不包含靜態(tài)字段而只包含純靜態(tài)方法的靜態(tài)類。純靜態(tài)方法是一種只根據(jù)輸入?yún)?shù)計(jì)算結(jié)果的函數(shù),它不讀取或分配任何靜態(tài)或?qū)嵗侄?。純靜態(tài)方法的主要優(yōu)點(diǎn)是易于測(cè)試。

首先嘗試維護(hù)BigClass的接口,并委托調(diào)用新提取的類。最后,BigClass應(yīng)該是一個(gè)沒有自己邏輯的純接口,可以為了方便將其保留,也可以將其扔掉,并開始只使用新類。

單元測(cè)試可以提供幫助: 在提取方法之前為每個(gè)方法編寫測(cè)試,以確保不會(huì)破壞功能。

5. 每個(gè)類盡量提供最少的方法

包含20個(gè)以上方法的類可能很難理解和維護(hù)。

一個(gè)類有許多方法可能是實(shí)現(xiàn)了太多責(zé)任的癥狀。

也許所面對(duì)的類控制了系統(tǒng)中太多的其他類,并且已經(jīng)超出了應(yīng)有的邏輯,成為了一個(gè)無所不能的類。

6. 加強(qiáng)低耦合

低耦合是理想狀態(tài),可以在應(yīng)用中進(jìn)行較少的更改實(shí)現(xiàn)程序的某個(gè)變更。從長(zhǎng)遠(yuǎn)來看,可以減少修改、添加新特性的大量時(shí)間、精力和成本。

低耦合可以通過使用抽象類或泛型類和方法來實(shí)現(xiàn)。

7. 加強(qiáng)高內(nèi)聚

單一責(zé)任原則規(guī)定一個(gè)類不應(yīng)該有多于一個(gè)更改的理由,這樣的類被稱為內(nèi)聚類。較高的LCOM值通??梢砸馕吨惖膬?nèi)聚性較差。有幾個(gè)LCOM指標(biāo),取值范圍為[0-1]。LCOM HS (HS代表Henderson-Sellers)取值范圍為[0-2]。LCOM HS值大于1時(shí)需要產(chǎn)生警惕。下面是計(jì)算LCOM指標(biāo):

LCOM = 1 — (sum(MF)/M*F)
LCOM HS = (M — sum(MF)/F)(M-1)

其中……

M是類中方法的數(shù)量(包括靜態(tài)方法和實(shí)例方法,它還包括構(gòu)造函數(shù)、屬性getter/setter、事件添加/刪除方法)。

F是類中實(shí)例字段的數(shù)量。

MF是類訪問特定實(shí)例字段的方法數(shù)量。

Sum(MF)是該類所有實(shí)例字段的MF之和。

這些公式背后的基本思想可以表述如下: 如果一個(gè)類的所有方法都使用它的所有實(shí)例字段,那么這個(gè)類就是完全內(nèi)聚的,這意味著sum(MF)=M*F,然后LCOM = 0和LCOMHS = 0。

LCOMHS值大于1就需要警惕了。

8. 只注釋代碼不能表達(dá)的內(nèi)容

鸚鵡學(xué)舌的代碼注釋沒有為讀者提供任何額外的東西。代碼庫(kù)中充斥著嘈雜的注釋和不正確的注釋,促使程序員忽略所有的注釋,或者采取積極的措施隱藏它們。

9. 盡量不要用重復(fù)的代碼

眾所周知,重復(fù)代碼的存在對(duì)軟件開發(fā)和維護(hù)有負(fù)面影響。實(shí)際上,一個(gè)主要缺點(diǎn)是,當(dāng)為了修復(fù)bug或添加新特性而更改重復(fù)代碼的實(shí)例時(shí),所有對(duì)應(yīng)的代碼必須同時(shí)更改。

產(chǎn)生重復(fù)代碼最常見的原因是復(fù)制/粘貼操作,這種情況下,相似的源代碼出現(xiàn)在兩個(gè)或多個(gè)地方。許多文章、書籍和網(wǎng)站都警告不要采用這種做法,但有時(shí)實(shí)踐這些建議并不容易,開發(fā)人員還是會(huì)選擇簡(jiǎn)單的解決方案: 復(fù)制/粘貼大法。

使用適當(dāng)?shù)墓ぞ呖梢匀菀椎膹膹?fù)制/粘貼操作中檢測(cè)到重復(fù)代碼,但是,在某些情況下,克隆代碼很難被檢測(cè)到。

10. 不變性有助于多線程編程

基本上,如果對(duì)象在創(chuàng)建之后狀態(tài)不變,那么這個(gè)對(duì)象就是不可變(immutable)的。如果一個(gè)類的實(shí)例是不可變的,那么該類就是不可變的。

不可變對(duì)象極大簡(jiǎn)化了并發(fā)編程,這是支持使用它的重要理由。想想看,為什么編寫適當(dāng)?shù)亩嗑€程程序是一項(xiàng)艱巨的任務(wù)?因?yàn)橥骄€程訪問資源(對(duì)象或其他操作系統(tǒng)資源)是很困難的。為什么同步這些訪問很困難?因?yàn)楹茈y保證多個(gè)線程對(duì)多個(gè)對(duì)象進(jìn)行的多次寫訪問和讀訪問之間不會(huì)出現(xiàn)競(jìng)爭(zhēng)條件。如果不再有寫訪問會(huì)怎么樣?換句話說,如果被線程訪問的對(duì)象的狀態(tài)沒有改變會(huì)怎么樣?就不再需要同步了!

關(guān)于不可變類的另一個(gè)好處是它們永遠(yuǎn)不會(huì)違反里氏替換原則(LSP, Liskov Subtitution Principle),以下是維基百科對(duì)LSP的定義:

Liskov的行為子類型的概念定義了可變對(duì)象可替換性的概念,也就是說,如果S是T的子類型,那么程序中T類型的對(duì)象可以被替換為S類型的對(duì)象,而不改變?cè)摮绦虻娜魏纹谕麑傩?例如,正確性)。

如果沒有公共字段,沒有可以更改其內(nèi)部數(shù)據(jù)的方法,并且派生類方法無法更改其內(nèi)部數(shù)據(jù),那么引用對(duì)象類就是不可變的。因?yàn)橹挡豢勺儯栽谒星闆r下都可以引用相同的對(duì)象,不需要復(fù)制構(gòu)造函數(shù)或賦值操作符。出于這個(gè)原因,建議將復(fù)制構(gòu)造函數(shù)和賦值操作符設(shè)為私有,或者從boost::noncopyable繼承,或者使用新的C++ 11特性“顯式默認(rèn)和刪除特殊成員函數(shù)”[2]。

如何加強(qiáng)對(duì)這些最佳實(shí)踐進(jìn)行檢查?

CppDepend[3]提供了名為CQLinq[4]的代碼查詢語言,可以像數(shù)據(jù)庫(kù)一樣查詢代碼庫(kù)。開發(fā)人員、設(shè)計(jì)人員和架構(gòu)師可以自定義查詢,以便輕松找到容易出現(xiàn)bug的情況。

通過CQLinq,可以結(jié)合來自代碼度量、依賴關(guān)系、API使用和其他模型的數(shù)據(jù)來定義非常高級(jí)的查詢,以匹配容易出現(xiàn)bug的情況。

例如,分析clang源代碼后,可以檢測(cè)到大類:

873f83c0-4e99-11ed-a3b6-dac502259ad0.png

檢測(cè)到有大量方法的類:

876b6bac-4e99-11ed-a3b6-dac502259ad0.png

或者檢測(cè)到內(nèi)聚性較差的類:

8802c402-4e99-11ed-a3b6-dac502259ad0.png

審核編輯:郭婷


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2131

    瀏覽量

    77416
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4977

    瀏覽量

    74417
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    使用VectorCAST/C++的AI輔助測(cè)試功能

    從2026版本開始,VectorCAST/C++推出首批AI輔助測(cè)試功能,旨在幫助開發(fā)團(tuán)隊(duì)解決單元測(cè)試過程中的兩個(gè)核心難點(diǎn):
    的頭像 發(fā)表于 04-27 14:37 ?278次閱讀

    手搓C++離散小波變換DWT程序

    關(guān)于小波變換,我們當(dāng)然可以選擇速度更快地方式來使用它。和python相比,C++編譯后的代碼在對(duì)同一組參數(shù)配置并且處理同一組數(shù)據(jù),在沒有優(yōu)化的情況下,處理速度可以快達(dá)10倍上,均不包括把結(jié)果寫入csv文件步驟的時(shí)間。下圖中的19
    的頭像 發(fā)表于 04-22 14:15 ?95次閱讀
    手搓<b class='flag-5'>C++</b>離散小波變換DWT程序

    C++與lua聯(lián)合編程

    的出現(xiàn),在經(jīng)濟(jì)上相當(dāng)于建立了一個(gè)高度標(biāo)準(zhǔn)化的“自由貿(mào)易區(qū)”或“中轉(zhuǎn)倉(cāng)庫(kù)”。無論 C++ 想傳給 Lua 一個(gè)復(fù)雜的嵌套表,還是 Lua 想回調(diào) C++ 的一
    發(fā)表于 04-19 16:27

    keil實(shí)現(xiàn)cc++混合編程

    參考touchgfx生成的代碼,發(fā)現(xiàn)了一個(gè)需要添加--cpp11 參數(shù)的解決方法,具體操作如下。 一、創(chuàng)建一個(gè)空白的C文件和頭文件在頭文件
    發(fā)表于 01-26 08:58

    C語言與C++的區(qū)別及聯(lián)系

    缺點(diǎn):性能比面向過程低。 二、具體語言上的區(qū)別 1、關(guān)鍵字的不同 C語言有32個(gè)關(guān)鍵字;C++有63個(gè)關(guān)鍵字。 2、后綴名不同 C
    發(fā)表于 12-24 07:23

    CC++之間的聯(lián)系

    且不需要高級(jí)特性的場(chǎng)景,而C++則在提供高效性能的同時(shí),還能借助面向?qū)ο蠛头盒途幊痰忍匦蕴岣哕浖目删S護(hù)性和可擴(kuò)展性
    發(fā)表于 12-11 06:51

    C語言和C++之間的區(qū)別是什么

    C++的標(biāo)準(zhǔn)庫(kù)那樣集成度高和功能齊全。 6、編譯器與語言特性: C++編譯器通常比C語言編譯器更加復(fù)雜,因?yàn)樗?b class='flag-5'>需要處理更多的語言特性,比如模板元編程、命名空間、引用等。
    發(fā)表于 12-11 06:23

    C/C++條件編譯

    條件編譯是一種在編譯時(shí)根據(jù)條件選擇性地包含或排除部分代碼的處理方法。在 C/C++ 中,條件編譯使用預(yù)處理指令 #ifdef、#endif、#else 和 #elif 來實(shí)現(xiàn)。常用的條件編譯指令有
    發(fā)表于 12-05 06:21

    C++程序異常的處理機(jī)制

    運(yùn)行代碼進(jìn)行分離,使得程序更加模塊化;另一方面,C++的異常處理可以不需要異常處理在異常發(fā)生時(shí)的同一個(gè)函數(shù),而是可以在更上層合適的位置進(jìn)行處理。 下面,我們一起來看看
    發(fā)表于 12-02 07:12

    嵌入式C/C++回歸測(cè)試四大最佳實(shí)踐(附自動(dòng)化測(cè)試工具TESSY使用教程)

    嵌入式開發(fā)中,一次微小的代碼改動(dòng)都可能引發(fā)“蝴蝶效應(yīng)”,如何守護(hù)系統(tǒng)的穩(wěn)健?推薦專業(yè)的自動(dòng)化測(cè)試工具#TESSY,源自戴姆勒-奔馳,是嵌入式C/C++單元/集成測(cè)試的標(biāo)桿。
    的頭像 發(fā)表于 10-31 14:21 ?592次閱讀
    嵌入式<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>回歸測(cè)試四大<b class='flag-5'>最佳</b><b class='flag-5'>實(shí)踐</b>(附自動(dòng)化測(cè)試工具TESSY使用教程)

    C/C++代碼靜態(tài)測(cè)試工具Perforce QAC 2025.3的新特性

    ?Perforce Validate?中?QAC?項(xiàng)目的相對(duì)/根路徑的支持。C++?分析也得到了增強(qiáng),增加了用于檢測(cè) C++?并發(fā)問題的新檢查,并改進(jìn)了實(shí)體名稱和實(shí)
    的頭像 發(fā)表于 10-13 18:11 ?756次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>代碼</b>靜態(tài)測(cè)試工具Perforce QAC 2025.3的新特性

    Perforce QAC產(chǎn)品簡(jiǎn)介:面向C/C++的靜態(tài)代碼分析工具(已通過SO 26262認(rèn)證)

    Perforce QAC專為C/C++開發(fā)者打造,支持多種編碼規(guī)范、功能安全標(biāo)準(zhǔn)(ISO 26262)等,廣泛用于汽車、醫(yī)療、嵌入式開發(fā)領(lǐng)域,可幫助快速識(shí)別關(guān)鍵缺陷、提升代碼質(zhì)量、實(shí)現(xiàn)合規(guī)交付。
    的頭像 發(fā)表于 07-10 15:57 ?1487次閱讀
    Perforce QAC產(chǎn)品簡(jiǎn)介:面向<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>的靜態(tài)<b class='flag-5'>代碼</b>分析工具(已通過SO 26262認(rèn)證)

    Linux網(wǎng)絡(luò)管理的關(guān)鍵技術(shù)和最佳實(shí)踐

    在大型互聯(lián)網(wǎng)企業(yè)中,Linux網(wǎng)絡(luò)管理是運(yùn)維工程師的核心技能之一。面對(duì)海量服務(wù)器、復(fù)雜網(wǎng)絡(luò)拓?fù)?、高并發(fā)流量,運(yùn)維人員需要掌握從基礎(chǔ)網(wǎng)絡(luò)配置到高級(jí)網(wǎng)絡(luò)優(yōu)化的全套技術(shù)棧。本文將結(jié)合大廠實(shí)際場(chǎng)景,深入解析Linux網(wǎng)絡(luò)管理的關(guān)鍵技術(shù)和最佳實(shí)踐
    的頭像 發(fā)表于 07-09 09:53 ?1140次閱讀

    在OpenVINO? C++代碼中啟用 AddressSanitizer 時(shí)的內(nèi)存泄漏怎么解決?

    在 OpenVINO? C++代碼中啟用 AddressSanitizer 時(shí)遇到內(nèi)存泄漏: \"#0 0xaaaab8558370 in operator new(unsigned
    發(fā)表于 06-23 07:16

    天馬榮獲新財(cái)富雜志“2024 ESG最佳實(shí)踐獎(jiǎng)”

    天馬可持續(xù)發(fā)展?ESG表現(xiàn)再獲認(rèn)可,上榜2024年新財(cái)富雜志最佳上市公司評(píng)選“ESG最佳實(shí)踐榜單”。
    的頭像 發(fā)表于 05-21 14:43 ?1078次閱讀
    鄂托克前旗| 邹平县| 昭通市| 吉首市| 龙川县| 称多县| 会东县| 公主岭市| 湖州市| 广平县| 大悟县| 定襄县| 平利县| 惠东县| 祁门县| 禄丰县| 石狮市| 肇庆市| 开远市| 鄂伦春自治旗| 兖州市| 浦城县| 湘潭市| 岳阳市| 中方县| 湖口县| 永顺县| 平江县| 梁山县| 依安县| 海伦市| 金门县| 凤城市| 霞浦县| 宽甸| 利川市| 聊城市| 玉环县| 明星| 宁国市| 增城市|