相關文章(zhāng)
欄目分(fēn)類 classification
C++編程技術分(fēn)享-命名空間的(de)5個(gè)常見用(yòng)法
命名空間在1995年被引入到 c++ 标準中,通(tōng)常是這(zhè)樣定義的(de):命名空間定義了(le)新的(de)作用(yòng)域。它們提供了(le)一種避免名稱沖突的(de)方法。c++ 中的(de)命名空間通(tōng)常用(yòng)于避免命名沖突。盡管命名空間在最近的(de) c++ 代碼中廣泛使用(yòng),但大(dà)多(duō)數較舊(jiù)代碼都不使用(yòng)此工具。基于對(duì)衆多(duō)C++項目源碼的(de)探索與研究,總結出了(le)在這(zhè)些項目中使用(yòng)命名空間的(de)常見原因。
1-避免名稱沖突
如前所述,這(zhè)是在C++中使用(yòng)命名空間最常見的(de)原因,在這(zhè)種情況下(xià),它們的(de)使用(yòng)隻是對(duì)編譯器有效。無法爲開發人(rén)員(yuán)在代碼可(kě)讀性和(hé)維護性方面帶來(lái)什(shén)麽價值。
2-模塊化(huà)應用(yòng)程序
命名空間采取 “Namespace-by-feature ”的(de)方法使代碼模塊化(huà)。”Namespace-by-feature” 通(tōng)過命名空間來(lái)反映功能集。它将具有相互關聯的(de)項歸類在同一個(gè)命名空間。這(zhè)會形成具有高(gāo)内聚低耦合(譯者注:高(gāo)内聚是指一個(gè)軟件模塊是由相關性很強的(de)代碼組成,隻負責一項任務。耦合是一個(gè)軟件結構内不同模塊之間互連程度的(de)度量)、模塊性很強的(de)命名空間。
Boost是按功能分(fēn)組的(de)最佳示例, 它包含數以千計的(de)命名空間, 每一個(gè)都用(yòng)于對(duì)特定功能進行分(fēn)組。
3-匿名命名空間
匿名的(de)命名空間可(kě)避免産生全局靜态變量。您創建的(de) “匿名” 命名空間隻能在創建它的(de)文件中訪問。
4-解決枚舉類型成員(yuán)重名問題
如果在同一個(gè)作用(yòng)域内定義了(le)具有相同名稱的(de)枚舉,C++中的(de)“傳統”枚舉會在其作用(yòng)域内導出枚舉值,可(kě)能會導緻名稱沖突,
在一個(gè)大(dà)型項目中,不能保證兩個(gè)不同的(de)枚舉都不會以同名命名。這(zhè)個(gè)問題在C++ 11中已經得(de)以解決,它使用(yòng)枚舉類,隐式地對(duì)枚舉名稱中的(de)枚舉值進行定義。
許多(duō)年前, 使用(yòng)在命名空間内聲明(míng)枚舉的(de)技巧解決這(zhè)個(gè)問題, 而不是像這(zhè)樣聲明(míng)枚舉
5-隐藏實現
對(duì)于在頭文件中實現的(de)模闆庫,開發者在調用(yòng)時(shí)不需要用(yòng)到特殊的(de)數據類型,因爲他(tā)們隻專注于功能的(de)實現,所以對(duì)于找到一種适合開發者調用(yòng)庫的(de)方法是很有趣的(de)。在c#中, “internal” 關鍵字做(zuò)了(le)這(zhè)項工作, 但是在c++中,沒有辦法将公有數據類型完全對(duì)開發者進行隐藏。
1-避免名稱沖突
如前所述,這(zhè)是在C++中使用(yòng)命名空間最常見的(de)原因,在這(zhè)種情況下(xià),它們的(de)使用(yòng)隻是對(duì)編譯器有效。無法爲開發人(rén)員(yuán)在代碼可(kě)讀性和(hé)維護性方面帶來(lái)什(shén)麽價值。
2-模塊化(huà)應用(yòng)程序
命名空間采取 “Namespace-by-feature ”的(de)方法使代碼模塊化(huà)。”Namespace-by-feature” 通(tōng)過命名空間來(lái)反映功能集。它将具有相互關聯的(de)項歸類在同一個(gè)命名空間。這(zhè)會形成具有高(gāo)内聚低耦合(譯者注:高(gāo)内聚是指一個(gè)軟件模塊是由相關性很強的(de)代碼組成,隻負責一項任務。耦合是一個(gè)軟件結構内不同模塊之間互連程度的(de)度量)、模塊性很強的(de)命名空間。
Boost是按功能分(fēn)組的(de)最佳示例, 它包含數以千計的(de)命名空間, 每一個(gè)都用(yòng)于對(duì)特定功能進行分(fēn)組。
3-匿名命名空間
匿名的(de)命名空間可(kě)避免産生全局靜态變量。您創建的(de) “匿名” 命名空間隻能在創建它的(de)文件中訪問。
4-解決枚舉類型成員(yuán)重名問題
如果在同一個(gè)作用(yòng)域内定義了(le)具有相同名稱的(de)枚舉,C++中的(de)“傳統”枚舉會在其作用(yòng)域内導出枚舉值,可(kě)能會導緻名稱沖突,
在一個(gè)大(dà)型項目中,不能保證兩個(gè)不同的(de)枚舉都不會以同名命名。這(zhè)個(gè)問題在C++ 11中已經得(de)以解決,它使用(yòng)枚舉類,隐式地對(duì)枚舉名稱中的(de)枚舉值進行定義。
許多(duō)年前, 使用(yòng)在命名空間内聲明(míng)枚舉的(de)技巧解決這(zhè)個(gè)問題, 而不是像這(zhè)樣聲明(míng)枚舉
許多(duō) c++ 項目使用(yòng)此技巧,例如Unreal Engine(譯者注:UNREAL ENGINE中文名稱爲“虛幻引擎” ,是目前世界最知名授權最廣的(de)頂尖遊戲引擎,占有全球商用(yòng)遊戲引擎80%的(de)市場(chǎng)份額)源代碼就廣泛使用(yòng)此技術。
5-隐藏實現
對(duì)于在頭文件中實現的(de)模闆庫,開發者在調用(yòng)時(shí)不需要用(yòng)到特殊的(de)數據類型,因爲他(tā)們隻專注于功能的(de)實現,所以對(duì)于找到一種适合開發者調用(yòng)庫的(de)方法是很有趣的(de)。在c#中, “internal” 關鍵字做(zuò)了(le)這(zhè)項工作, 但是在c++中,沒有辦法将公有數據類型完全對(duì)開發者進行隐藏。
上一篇:提高(gāo) C++編程技術7種可(kě)靠方法推薦 [返回列表]
下(xià)一篇:易語言入門教程之簡單代碼的(de)編寫
說點什(shén)麽吧
- 全部評論(0)
還(hái)沒有評論,快(kuài)來(lái)搶沙發吧!