如何結構化我們的程式碼

帶你聊技術發表於2023-12-08

來源:小技術君

軟體設計最佳實踐,探討按層、按特性和六邊形架構/埠和介面卡的程式碼結構。

在這篇文章中,我將探討如何組織我們的程式碼並討論最佳實踐,涵蓋三種不同的方法:按層、按特性和六邊形架構/埠和介面卡,以及它們的優缺點。

在探討不同的程式碼結構方法之前,我們需要了解基本的軟體設計原則:

內聚性(Cohesion):指模組內部的類彼此相關的程度。耦合性(Coupling):指不同模組之間的依賴程度。

如何結構化我們的程式碼

模組性(Modularity):指軟體系統被分成獨立模組的程度。每個模組封裝了一組特定的功能,並被設計成能夠獨立工作,透過明確定義的介面與其他模組互動。抽象化(Abstraction):隱藏實現細節,只透過介面暴露必要的功能。關注點分離(Separation of Concerns):具有明確定義的各個部分,每個部分處理特定的關注點。封裝性(Encapsulation):將資料和方法捆綁到單個模組或類中,以隱藏內部細節。

讓我們更仔細地看看內聚性和耦合性?

內聚性描述軟體的 關注點有多集中它與單一職責原則密切相關。

高內聚性 意味著模組內的類彼此密切相關,並共享一個共同的、明確定義的目的。低內聚性 意味著模組內的類關係不緊密,缺乏明確的目的,具有無關的責任。

遵循的最佳實踐是追求高內聚性和松耦合

如何結構化我們的程式碼

鬆散的耦合被認為是計算機系統良好結構和良好設計的跡象,與高內聚性結合使用時,可實現高可讀性和可維護性。

如何結構化我們的程式碼

現在,讓我們探討不同的程式碼組織方式。首先,我將介紹按層組織,然後是按特性組織,對比這兩者。之後,我們將探討六邊形架構/埠和介面卡模式。

如何結構化我們的程式碼

按層組織

它表示一個專案結構,其中類被組織到多個層中,每個層負責一組特定的功能。






















src├── main│   ├── java│   │   └── com│   │       └── app│   │           ├── service│   │           │   └── UserService.java│   │           │   └── OrderService.java│   │           │   └── ProductService.java│   │           ├── domain│   │           │   └── User.java│   │           │   └── Order.java│   │           │   └── Product.java│   │           ├── repository│   │           │   └── UserRepository.java│   │           │   └── OrderRepository.java│   │           │   └── ProductRepository.java│   │           ├── controller│   │           │   └── UserController.java│   │           │   └── OrderController.java│   │           │   └── ProductController.java

典型的層包括:

1.表示層(Presentation Layer):負責處理使用者互動並向使用者呈現資訊。通常包括與使用者介面、控制器和檢視相關的元件。2.服務層(Service Layer):包含業務邏輯並提供演示層所需的資料。3.領域包(Domain Package):該包包含領域實體。4.資料訪問層(Data Access Layer):該層處理資料到/從資料庫的持久化和檢索。5.基礎設施包(Infrastructure Package):該包提供支援應用程式操作的服務。它可能包括用於日誌記錄、配置、安全等橫切關注點的元件。

使用 按層組織 的一些缺點:

低內聚性:不相關的類被組合到同一個包中。高耦合性封裝性差:大多數類是公共的,因此我們無法將類設定為包私有,因為它們在其他層中是需要的。低模組性:由於每個包包含與特定層相關的類,因此很難將程式碼分解為後來的微服務。可維護性差:由於類散佈在不同的包中,很難找到正在尋找的類。它促進了資料庫驅動設計,而不是領域驅動設計。

按特性組織

它表示一種根據功能或特性而不是層次結構組織程式碼的結構。在這種方法中,每個包代表一個獨特且獨立的功能。

目標是將與特定特性相關的所有元件(如控制器、服務、儲存庫和領域類)組合到一個包中。


















src├── main│   ├── java│   │   └── com│   │       └── app│   │           ├── user│   │           │   ├── UserController.java│   │           │   ├── UserService.java│   │           │   └── UserRepository.java│   │           ├── order│   │           │   ├── OrderController.java│   │           │   ├── OrderService.java│   │           │   └── OrderRepository.java│   │           ├── product│   │           │   ├── ProductController.java│   │           │   ├── ProductService.java│   │           │   └── ProductRepository.java

使用此結構的一些好處包括:

高內聚性低耦合性強封裝性:允許某些類將其訪問修飾符設定為包私有而不是公共。高模組性:由於每個包包含與特定功能相關的類,因此很容易將程式碼分解為後來的微服務。可維護性:減少了在包之間導航的需求,因為所有與特性相關的類都在同一個包中。促進了領域驅動設計

六邊形架構/埠和介面卡模式

六邊形架構,也稱為埠和介面卡,是由阿利斯泰爾·科克本博士在他2005年的一篇文章中介紹的軟體架構模式。[1]

該模式透過保持核心業務邏輯獨立於外部細節,並不緊密耦合於資料庫、使用者介面或外部服務等外部依賴,促進了關注點的隔離/分離。

這使得測試、維護和發展系統更加容易。

如何結構化我們的程式碼

在此模式中:

1.領域/核心(Domain / Core)代表應用程式的業務邏輯或領域(應用程式的核心)。2.埠(Ports)埠是核心定義的介面,允許與外部元件進行互動。這些可以包括服務、儲存庫或任何外部依賴的介面。3.介面卡(Adapters)介面卡是埠的實現。它們將核心應用程式連線到資料庫、使用者介面和外部服務等外部元件。介面卡可以針對不同的技術或協議進行特定的實現。4.主要操作者(Primary actors)系統的使用者,如webhook、UI請求或測試指令碼。5.次要操作者(Secondary actors)被應用程式使用的這些服務是 Repository(例如資料庫)或 Recipient(例如訊息佇列)。

如何結構化我們的程式碼

六邊形形狀:

六邊形形狀象徵著核心應用程式位於中心,周圍是介面卡。這個形狀代表了核心與其外部依賴之間的明確分離。

頂級包結構應如下所示:










src/main/  java    mina      dev        <servicename>          adapters          config          core          <ServiceApplication>.java

根包應只包含包:coreadaptersconfig

core 包含服務的所有領域邏輯。它可以包含子包。埠應該位於 core 包中:埠只是由核心宣告的要呼叫或由介面卡實現的介面。adapters 包含所有介面卡實現程式碼。它可以包含子包以按單個介面卡或技術組織介面卡程式碼。config 包含用於連線不同元件的配置類。

包依賴規則:

根包可以依賴於所有其他包。config 包可以依賴於 core 和 adaptersadapters 可以依賴於 core,但不可以依賴於 configcore 不得依賴於其他任何包。

希望這篇文章能夠幫助您更好地理解不同的程式碼結構。

引用連結

[1] 軟體架構模式。: 


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024922/viewspace-2999234/,如需轉載,請註明出處,否則將追究法律責任。

相關文章