在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

CPP開(kāi)發(fā)者 ? 來(lái)源:DeepNoMind ? 作者:俞凡 ? 2022-10-18 15:20 ? 次閱讀

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

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

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

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

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

現(xiàn)代C++庫(kù)廣泛使用命名空間來(lái)模塊化代碼庫(kù),它們利用“Namespace-by-feature”方法,按功能劃分命名空間來(lái)反映功能集,將單個(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)。

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

4. 類(lèi)越小越好

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

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

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

較小的類(lèi)劃分應(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)類(lèi)。純靜態(tài)方法是一種只根據(jù)輸入參數(shù)計(jì)算結(jié)果的函數(shù),它不讀取或分配任何靜態(tài)或?qū)嵗侄巍<冹o態(tài)方法的主要優(yōu)點(diǎn)是易于測(cè)試。

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

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

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

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

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

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

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

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

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

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

單一責(zé)任原則規(guī)定一個(gè)類(lèi)不應(yīng)該有多于一個(gè)更改的理由,這樣的類(lèi)被稱為內(nèi)聚類(lèi)。較高的LCOM值通常可以意味著類(lèi)的內(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是類(lèi)中方法的數(shù)量(包括靜態(tài)方法和實(shí)例方法,它還包括構(gòu)造函數(shù)、屬性getter/setter、事件添加/刪除方法)。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如果沒(méi)有公共字段,沒(méi)有可以更改其內(nèi)部數(shù)據(jù)的方法,并且派生類(lèi)方法無(wú)法更改其內(nèi)部數(shù)據(jù),那么引用對(duì)象類(lèi)就是不可變的。因?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]的代碼查詢語(yǔ)言,可以像數(shù)據(jù)庫(kù)一樣查詢代碼庫(kù)。開(kāi)發(fā)人員、設(shè)計(jì)人員和架構(gòu)師可以自定義查詢,以便輕松找到容易出現(xiàn)bug的情況。

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

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

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

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

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

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

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

審核編輯:郭婷


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

    關(guān)注

    22

    文章

    2109

    瀏覽量

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

    關(guān)注

    30

    文章

    4789

    瀏覽量

    68639
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    同樣是函數(shù),在CC++中有什么區(qū)別

    同樣是函數(shù),在 CC++ 中有什么區(qū)別? 第一個(gè)返回值。 C語(yǔ)言的函數(shù)可以不寫(xiě)返回值類(lèi)型,編譯器會(huì)默認(rèn)為返回 int。 但是 C++
    的頭像 發(fā)表于 11-29 10:25 ?321次閱讀

    4G模組之UDP應(yīng)用的最佳實(shí)踐

    今天說(shuō)的是4G模組之UDP應(yīng)用,展示最佳實(shí)踐,送你參考。
    的頭像 發(fā)表于 11-08 09:24 ?387次閱讀
    4G模組之UDP應(yīng)用的<b class='flag-5'>最佳</b><b class='flag-5'>實(shí)踐</b>!

    MES系統(tǒng)的最佳實(shí)踐案例

    效率、降低成本、保證產(chǎn)品質(zhì)量。 MES系統(tǒng)的最佳實(shí)踐案例 引言 在當(dāng)今競(jìng)爭(zhēng)激烈的制造業(yè)環(huán)境中,企業(yè)必須不斷尋求創(chuàng)新和改進(jìn)的方法來(lái)保持競(jìng)爭(zhēng)力。MES系統(tǒng)作為一種關(guān)鍵的信息技術(shù)工具,已經(jīng)被廣泛應(yīng)用于各種制造行業(yè),以實(shí)現(xiàn)生產(chǎn)過(guò)程的優(yōu)化和管理。本文將探討MES系統(tǒng)的
    的頭像 發(fā)表于 10-27 09:33 ?956次閱讀

    云計(jì)算平臺(tái)的最佳實(shí)踐

    云計(jì)算平臺(tái)的最佳實(shí)踐涉及多個(gè)方面,以確保高效、安全、可擴(kuò)展和成本優(yōu)化的云環(huán)境。以下是一些關(guān)鍵的最佳實(shí)踐: 一、云成本優(yōu)化 詳細(xì)分析云使用情況 :通過(guò)細(xì)致的監(jiān)控和分析,識(shí)別低ROI(投資
    的頭像 發(fā)表于 10-24 09:17 ?365次閱讀

    RTOS開(kāi)發(fā)最佳實(shí)踐

    基于RTOS編寫(xiě)應(yīng)用程序時(shí),有一些要注意事項(xiàng)。在本節(jié)中,您將學(xué)習(xí)RTOS開(kāi)發(fā)最佳實(shí)踐,例如POSIX合規(guī)性、安全性和功能安全認(rèn)證。
    的頭像 發(fā)表于 08-20 11:24 ?460次閱讀

    ModusToolbox 3.2在c代碼中包含c++代碼的正確步驟是什么?

    使用 ModusToolbox 3.2 我有一個(gè)用純 C 語(yǔ)言編寫(xiě)的 XMC4700 項(xiàng)目。 我正在嘗試添加一些 C++ 函數(shù),并將其合并到我的原始代碼中。 我可以構(gòu)建獨(dú)立的 .cpp
    發(fā)表于 07-23 08:21

    C++中實(shí)現(xiàn)類(lèi)似instanceof的方法

    C++有多態(tài)與繼承,但是很多人開(kāi)始學(xué)習(xí)C++,有時(shí)候會(huì)面臨一個(gè)常見(jiàn)問(wèn)題,就是如何向下轉(zhuǎn)型,特別是不知道具體類(lèi)型的時(shí)候,這個(gè)時(shí)候就希望C++ 可以向Java或者Python中有insta
    的頭像 發(fā)表于 07-18 10:16 ?600次閱讀
    <b class='flag-5'>C++</b>中實(shí)現(xiàn)類(lèi)似instanceof的方法

    OpenCV圖像識(shí)別C++代碼

    的頭文件 在您的C++代碼中,包含以下必要的頭文件: # include # include # include # include # include # include # include 讀取圖像
    的頭像 發(fā)表于 07-16 10:42 ?2043次閱讀

    C/C++中兩種宏實(shí)現(xiàn)方式

    #ifndef的方式受C/C++語(yǔ)言標(biāo)準(zhǔn)支持。它不僅可以保證同一個(gè)文件不會(huì)被包含多次,也能保證內(nèi)容完全相同的兩個(gè)文件(或者代碼片段)不會(huì)被不
    的頭像 發(fā)表于 04-19 11:50 ?629次閱讀

    鴻蒙OS開(kāi)發(fā)實(shí)例:【Native C++

    使用DevEco Studio創(chuàng)建一個(gè)Native C++應(yīng)用。應(yīng)用采用Native C++模板,實(shí)現(xiàn)使用NAPI調(diào)用C標(biāo)準(zhǔn)庫(kù)的功能。使用C
    的頭像 發(fā)表于 04-14 11:43 ?2640次閱讀
    鴻蒙OS開(kāi)發(fā)實(shí)例:【Native <b class='flag-5'>C++</b>】

    為什么很少用C++開(kāi)發(fā)單片機(jī)

    C語(yǔ)言是面向過(guò)程的語(yǔ)言,C++是面向?qū)ο蟮木幊陶Z(yǔ)言。結(jié)合本文來(lái)說(shuō),面向過(guò)程相比面向?qū)ο蟮木幊蹋?b class='flag-5'>代碼量(bin文件)更小,運(yùn)行效率更高。
    發(fā)表于 03-25 14:26 ?979次閱讀
    為什么很少用<b class='flag-5'>C++</b>開(kāi)發(fā)單片機(jī)

    c語(yǔ)言,c++,java,python區(qū)別

    C語(yǔ)言、C++、Java和Python是四種常見(jiàn)的編程語(yǔ)言,各有優(yōu)點(diǎn)和特點(diǎn)。 C語(yǔ)言: C語(yǔ)言是一種面向過(guò)程的編程語(yǔ)言。它具有底層的特性,能夠?qū)τ?jì)算機(jī)硬件進(jìn)行直接操作。
    的頭像 發(fā)表于 02-05 14:11 ?2403次閱讀

    使用aurix c/c++任務(wù)調(diào)試器調(diào)試代碼,為什么無(wú)法得到結(jié)果?

    我正在嘗試使用 aurix 開(kāi)發(fā)工作室 c/c++ 任務(wù)調(diào)試器調(diào)試代碼,但無(wú)法得到結(jié)果。 CAN 你幫我了解需要安裝哪些軟件以及需要
    發(fā)表于 01-30 06:24

    C++簡(jiǎn)史:C++是如何開(kāi)始的

    MISRA C++:2023,MISRA? C++ 標(biāo)準(zhǔn)的下一個(gè)版本,來(lái)了!為了幫助您做好準(zhǔn)備,我們介紹了 Perforce 首席技術(shù)支持工程師 Frank van den Beuken 博士撰寫(xiě)
    的頭像 發(fā)表于 01-11 09:00 ?601次閱讀
    <b class='flag-5'>C++</b>簡(jiǎn)史:<b class='flag-5'>C++</b>是如何開(kāi)始的
    主站蜘蛛池模板: 又长又大又粗又硬3p免费视| 欧美乱理伦另类视频| 偷窥自拍亚洲色图| 一级特黄aaa大片大全| 免费国产成高清人在线视频| 亚洲天堂不卡| 婷婷午夜天| 免费看黄的视频网站| www.狠狠艹| 天堂8资源8在线| 18女毛片| 国产小视频免费在线观看| 日韩综合图区| 五月月色开心婷婷久久合| 深深激情网| 欧美电影一区二区三区| 婷婷深爱网| 人人看人人添人人爽| 四虎美女| 欧美色a电影精品aaaa| 色婷婷成人| 天堂视频在线视频观看2018| 在线观看网址你懂得| 久久99国产精品免费观看| 中文字幕国产一区| 亚洲性爱城| 日本视频三区| 深夜看片在线观看18| 中日韩精品视频在线观看| 乱高h亲女| 五月天婷婷激情| 欧美特黄视频在线观看| 丁香六月在线观看| 恐怖片大全恐怖片免费观看好看的恐怖片| 色视频免费在线观看| 老头天天吃我奶躁我的动图| www.色午夜.com| 午夜影院免费体验| 在线观看886影院成人影院| 欧美1024性视频| 乱色伦图片区|