簡體   English   中英

如何在 C++ 項目中組織多種數據類型

[英]How to organize multiple data types in a C++ project

在我們的項目 (C++14) 中,我們通過系統的功能分解將我們的軟件分成幾個組件。 每個模塊都駐留在自己的命名空間中,嵌入在系統的公共命名空間中。 我們使用 CMake 作為我們的構建系統,每個組件都是一個 static 庫,可以單獨構建並在最后鏈接在一起。

現在,在許多組件中定義了特定的數據類型,如 class 或結構,例如時間、要一起處理的數據字段的集合等。 這些數據結構在創建它們包含的數據的組件中本地定義。

但。 當我現在必須從其他組件訪問這些數據結構之一時,我必須包含來自特定組件的 header 並且在這兩個組件之間具有依賴關系。 由於這是一種常見的方法,我們的軟件組件之間有許多依賴關系,很容易導致循環依賴。 :(

在 C 世界中,我將創建一個GlobalDataStructures.h並添加在整個軟件系統中使用的所有數據結構。

(現代)C++ 方法是什么? 什么是最佳實踐?

“C 風格”方法背后的想法基本上是合理的。

作為一般規則,您希望將數據結構定義為盡可能遠離依賴關系樹的根。 如果發生循環,則某些數據結構必須向根部至少向上移動一級才能打破循環。

在某些時候,您最終會到達依賴根。 對於具有不同組件的項目,這意味着引入根組件。 它是一個組件——在你的情況下是 static 庫——就像任何其他組件一樣,它包含對整個系統而言必要和/或有用的數據結構和功能。 棘手的部分是不要讓那個組件成為廚房水槽下面的櫥櫃——畢竟現在你有一個方便的地方放東西,而不必考慮它們真正屬於哪里。 但這是人的問題,而不是技術問題。

通常我將 CMake 目標稱為根組件庫projectname_core 我曾經將其所有內容放入projectname::core命名空間。 但事實證明,團隊中的每個人都只是寫了using namespace projectname::core; 到處。 顯然,額外的命名空間沒有添加任何有用的信息,將系統范圍的東西放入projectname命名空間也同樣有效。 這就是我這些天所做的。

這是我的專業領域。 我是 POWER 的創建者,這是一種模擬制造的軟件架構。 你可以在這里閱讀我關於 DTO 的文章,因為我已經超越了單純的硬編碼。 什么是數據傳輸 Object?

現在回答您的問題...注意在分布式 (OOP) 架構中,您需要附加整個命名空間以使用 DTO,將 DTO 復制到每個使用命名空間中,或者將 DTO 集中到一個共享命名空間中。 然而,在 POWER 中,一個命名空間中的進程可以在它甚至不知道的 object 實例上運行,因為該進程綁定到 DTO 的引用屬性而不是 DTO(及其類型)本身。 POWER 是一種零耦合架構,因為制造業也是如此。

從技術上講,即使 DTO 高度相似甚至在結構上等效,進程也不應該共享 DTO。 共享模塊甚至 DTO 會導致集中化復雜性,這是我在此使用《哈佛商業評論》作為來源權威描述的組織缺陷: http://www.powersemantics.com/p.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM