亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現在的位置是:首頁 > 技術閱讀 >  C++類設計和實現的十大最佳實踐

C++類設計和實現的十大最佳實踐

時間:2024-02-15

C++代碼提供了足夠的靈活性,因此對于大部分工程師來說都很難把握。本文介紹了寫好C++代碼需要遵循的10個最佳實踐,并在最后提供了一個工具可以幫助我們分析C++代碼的健壯度。原文:10 Best practices to design and implement a C++ class

1. 盡可能嘗試使用新的C++標準

到2022年,C++已經走過了40多個年頭。新的C++標準實際上簡化了許多令人沮喪的細節,提供了新的現代方法來改進C++代碼,但讓開發人員認識到這一點并不容易。

以內存管理為例,這可能是C++中受到最多批評的機制。多年來,對象分配都是由new關鍵字完成的,開發人員一定得記住在代碼的某個地方調用delete。“現代C++”解決了這個問題,并促進了共享指針的使用。

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

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

Boost是按特性分組的最佳示例,其包含數千個命名空間,每個命名空間用于對特定的特性進行分組。

3. 抽象

數據抽象是C++中面向對象編程最基本和最重要的特性之一。抽象意味著只顯示基本信息而隱藏細節,數據抽象指的是僅向外部世界提供關于數據的基本信息,隱藏背景細節或實現。

盡管許多書籍、網絡資源、會議演講者和專家都推薦這種最佳實踐,但在很多項目中,這條規則仍然被忽略了,許多類的細節并沒有被隱藏。

4. 類越小越好

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

需要很大的耐心重構一個大的類,甚至可能需要從頭重新創建所有東西。以下是一些重構建議:

  • BigClass中的邏輯必須被分成更小的類。這些較小的類最終可能成為嵌套在原始God Class中的私有類,God Class的實例對象由較小嵌套類的實例組成。
  • 較小的類劃分應該由God Class負責的多個職責驅動。要確定這些職責,通常需要查找與字段的子集強耦合的方法的子集。
  • 如果BigClass包含的邏輯比狀態多,一個好的選擇是定義一個或幾個不包含靜態字段而只包含純靜態方法的靜態類。純靜態方法是一種只根據輸入參數計算結果的函數,它不讀取或分配任何靜態或實例字段。純靜態方法的主要優點是易于測試。
  • 首先嘗試維護BigClass的接口,并委托調用新提取的類。最后,BigClass應該是一個沒有自己邏輯的純接口,可以為了方便將其保留,也可以將其扔掉,并開始只使用新類。
  • 單元測試可以提供幫助: 在提取方法之前為每個方法編寫測試,以確保不會破壞功能。
5. 每個類盡量提供最少的方法

包含20個以上方法的類可能很難理解和維護。

一個類有許多方法可能是實現了太多責任的癥狀。

也許所面對的類控制了系統中太多的其他類,并且已經超出了應有的邏輯,成為了一個無所不能的類。

6. 加強低耦合

低耦合是理想狀態,可以在應用中進行較少的更改實現程序的某個變更。從長遠來看,可以減少修改、添加新特性的大量時間、精力和成本。

低耦合可以通過使用抽象類或泛型類和方法來實現。

7. 加強高內聚

單一責任原則規定一個類不應該有多于一個更改的理由,這樣的類被稱為內聚類。較高的LCOM值通常可以意味著類的內聚性較差。有幾個LCOM指標,取值范圍為[0-1]。LCOM HS (HS代表Henderson-Sellers)取值范圍為[0-2]。LCOM HS值大于1時需要產生警惕。下面是計算LCOM指標:

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

其中……

  • M是類中方法的數量(包括靜態方法和實例方法,它還包括構造函數、屬性getter/setter、事件添加/刪除方法)。
  • F是類中實例字段的數量。
  • MF是類訪問特定實例字段的方法數量。
  • Sum(MF)是該類所有實例字段的MF之和。

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

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

8. 只注釋代碼不能表達的內容

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

9. 盡量不要用重復的代碼

眾所周知,重復代碼的存在對軟件開發和維護有負面影響。實際上,一個主要缺點是,當為了修復bug或添加新特性而更改重復代碼的實例時,所有對應的代碼必須同時更改。

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

使用適當的工具可以容易的從復制/粘貼操作中檢測到重復代碼,但是,在某些情況下,克隆代碼很難被檢測到。

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

基本上,如果對象在創建之后狀態不變,那么這個對象就是不可變(immutable)的。如果一個類的實例是不可變的,那么該類就是不可變的。

不可變對象極大簡化了并發編程,這是支持使用它的重要理由。想想看,為什么編寫適當的多線程程序是一項艱巨的任務?因為同步線程訪問資源(對象或其他操作系統資源)是很困難的。為什么同步這些訪問很困難?因為很難保證多個線程對多個對象進行的多次寫訪問和讀訪問之間不會出現競爭條件。如果不再有寫訪問會怎么樣?換句話說,如果被線程訪問的對象的狀態沒有改變會怎么樣?就不再需要同步了!

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

Liskov的行為子類型的概念定義了可變對象可替換性的概念,也就是說,如果S是T的子類型,那么程序中T類型的對象可以被替換為S類型的對象,而不改變該程序的任何期望屬性(例如,正確性)。

如果沒有公共字段,沒有可以更改其內部數據的方法,并且派生類方法無法更改其內部數據,那么引用對象類就是不可變的。因為值不可變,所以在所有情況下都可以引用相同的對象,不需要復制構造函數或賦值操作符。出于這個原因,建議將復制構造函數和賦值操作符設為私有,或者從boost::noncopyable繼承,或者使用新的C++ 11特性“顯式默認和刪除特殊成員函數”[2]

如何加強對這些最佳實踐進行檢查?

CppDepend[3]提供了名為CQLinq[4]的代碼查詢語言,可以像數據庫一樣查詢代碼庫。開發人員、設計人員和架構師可以自定義查詢,以便輕松找到容易出現bug的情況。

通過CQLinq,可以結合來自代碼度量、依賴關系、API使用和其他模型的數據來定義非常高級的查詢,以匹配容易出現bug的情況。

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

檢測到有大量方法的類:

或者檢測到內聚性較差的類:

References:
[1] 10 Best practices to design and implement a C++ class: https://issamvb.medium.com/10-best-practices-to-design-and-implement-a-c-class-4326611827e1#:~:text=10%20Best%20practices%20to%20design%20and%20implement%20a,class%20as%20you%20can.%20...%20More%20items...%20
[2] Explicitly defaulted and deleted special member functions: http://en.wikipedia.org/wiki/C%2B%2B11#Explicitly_defaulted_and_deleted_special_member_functions
[3] CppDepend: http://www.cppdepend.com/
[4] CQLinq: https://www.cppdepend.com/cqlinq

來源:C語言與CPP編程

- END -


這里有 一個優質的C++學習圈 等你加入,來一起鉆研C++吧。

亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品www| 国产乱子伦一区二区三区国色天香| 国产精品成人在线| 嫩模写真一区二区三区三州| 一本色道婷婷久久欧美| 国产色综合久久| 国产精品青草久久| 六月婷婷一区| 老司机精品视频一区二区三区| 亚洲一区二区三区视频播放| 在线看一区二区| 国产一区二区三区免费在线观看| 欧美精品激情blacked18| 欧美一区二区三区视频免费| 亚洲欧美成人一区二区在线电影 | 久久国产精品99久久久久久老狼| 亚洲国产精品va在线看黑人动漫| 欧美激情精品久久久久久蜜臀| 免费成人在线观看视频| 欧美一级片久久久久久久| 午夜精品亚洲一区二区三区嫩草| 日韩亚洲视频| 亚洲伦伦在线| 亚洲一区三区视频在线观看| 亚洲最新在线视频| 一区二区三区精品国产| 日韩一级黄色片| 亚洲精品资源| 亚洲制服丝袜在线| 亚洲视频大全| 欧美影院成人| 欧美在线一区二区三区| 午夜激情亚洲| 久久人人爽爽爽人久久久| 欧美在线看片| 久久综合网络一区二区| 久久婷婷国产综合精品青草 | 欧美亚洲一区二区三区| 亚洲素人一区二区| 欧美一区二区高清| 亚洲欧美制服另类日韩| 亚洲女同同性videoxma| 你懂的亚洲视频| 欧美激情精品久久久久久免费印度| 欧美日韩亚洲91| 国产精品久久久久久久久久久久久| 国产自产精品| 最新中文字幕亚洲| 一区二区三区日韩精品| 久久国产精品99久久久久久老狼| 久久精品色图| 国产精品国产三级国产a| 国产精品久久久久久久午夜片| 欧美日韩一区二区高清| 国产综合香蕉五月婷在线| 1024亚洲| 欧美一区二区三区视频免费播放| 久久精品免费电影| 久久爱www.| 欧美日韩在线不卡| 国产精品国产三级国产普通话三级| 国产精品亚洲第一区在线暖暖韩国| 国产一区二区三区精品欧美日韩一区二区三区 | 韩日欧美一区| 国内精品久久久久影院薰衣草| 亚洲精品国产精品国自产在线| av不卡免费看| 久久久久综合网| 欧美日韩高清在线一区| 欧美日韩成人综合| 在线成人中文字幕| 一区二区三区四区精品| 欧美sm视频| 国产精品丝袜白浆摸在线| 亚洲毛片网站| 久久精品国产第一区二区三区| 久久中文久久字幕| 国产日韩欧美在线播放| 最新国产の精品合集bt伙计| 国产精品99久久久久久宅男 | 欧美屁股在线| 国内精品美女av在线播放| 亚洲高清网站| 久久久久久综合网天天| 欧美三级视频在线观看| 亚洲精品三级| 久久另类ts人妖一区二区| 欧美另类一区| 91久久国产综合久久蜜月精品 | 久久亚洲色图| 国产精品久久久久久久久搜平片| 在线观看av不卡| 亚洲欧洲av一区二区| 国产精品日日摸夜夜添夜夜av| 亚洲精品午夜| 欧美日韩一级大片网址| 亚洲经典在线看| 亚洲欧美日本精品| 国产裸体写真av一区二区| 99精品99| 国产精品少妇自拍| 一本到12不卡视频在线dvd| 欧美日韩国产免费| 亚洲精品欧美一区二区三区| 欧美精品尤物在线| 亚洲欧洲日本一区二区三区| 午夜在线a亚洲v天堂网2018| 国产亚洲成av人在线观看导航 | 国产亚洲激情在线| 久久国产综合精品| 国产毛片精品国产一区二区三区| 国产精品久久久久久模特| 亚洲一区二区免费视频| 欧美日韩在线免费视频| 亚洲美女黄色| 欧美久久电影| 伊人久久久大香线蕉综合直播 | 性欧美video另类hd性玩具| 国产一区久久| 久久精品夜夜夜夜久久| 亚洲国产日韩一级| 欧美成人免费一级人片100| 国内精品国语自产拍在线观看| 免费日韩av电影| 亚洲黄色一区二区三区| 国产精品高潮呻吟| 亚洲午夜久久久久久久久电影网| 国产视频在线观看一区二区| 久久精品人人做人人爽| 尤物在线精品| 国产精品伦子伦免费视频| 午夜精品短视频| 亚洲福利视频一区二区| 国产精品久久久久高潮| 国产精品亚洲综合天堂夜夜| 看欧美日韩国产| 亚洲日本乱码在线观看| 国产精品日韩欧美大师| 久久国产精品99精品国产| 国产精品自拍视频| 欧美国产成人精品| 一区二区三区欧美成人| 在线免费观看成人网| 欧美另类视频在线| 久久视频国产精品免费视频在线| 亚洲激情偷拍| 欧美人妖在线观看| 国产亚洲欧美一区二区三区| 国产精品久久久久久影院8一贰佰 国产精品久久久久久影视 | 亚洲国产精品嫩草影院| 欧美国产日韩一区二区| 久久精品成人一区二区三区| 在线播放豆国产99亚洲| 国产午夜精品久久久久久久| 欧美a级一区二区| 久久精品五月婷婷| 亚洲美女网站| 欧美日本成人| 欧美成人首页| 香蕉av777xxx色综合一区| 一区二区三区 在线观看视| 国产精品羞羞答答| 韩国av一区| 乱中年女人伦av一区二区| 欧美一级大片在线观看| 99国产精品国产精品久久| 国产亚洲欧洲997久久综合| 国产精品视频你懂的| 美女诱惑一区| 美女日韩欧美| 性欧美8khd高清极品| 亚洲欧美中文字幕| 亚洲毛片在线免费观看| 亚洲精品欧美激情| 狠狠综合久久av一区二区老牛| 欧美v日韩v国产v| 欧美承认网站| 久久精品视频导航| 久久亚洲一区二区| 亚洲免费视频成人| 欧美一区二区三区四区在线观看| 亚洲精品国产精品国自产在线| 亚洲国产一区二区在线| 国产欧美日韩中文字幕在线| 欧美特黄一级| 欧美日韩一区国产| 美女黄网久久| 欧美区高清在线| 欧美日韩国产首页| 欧美性猛片xxxx免费看久爱| 欧美成人69av| 欧美久久久久免费| 免费观看欧美在线视频的网站| 免费不卡视频| 蜜臀91精品一区二区三区| 性色av一区二区三区红粉影视| 亚洲国产日韩欧美在线动漫| 欧美私人网站| 国产精品va| 欧美激情网站在线观看|