如何結構化我們的程式碼
來源:小技術君
軟體設計最佳實踐,探討按層、按特性和六邊形架構/埠和介面卡的程式碼結構。
在這篇文章中,我將探討如何組織我們的程式碼並討論最佳實踐,涵蓋三種不同的方法:按層、按特性和六邊形架構/埠和介面卡,以及它們的優缺點。
在探討不同的程式碼結構方法之前,我們需要了解基本的軟體設計原則:
•內聚性(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
根包應只包含包:core
、adapters
和config
。
•core
包含服務的所有領域邏輯。它可以包含子包。•埠應該位於 core
包中:埠只是由核心宣告的要呼叫或由介面卡實現的介面。•adapters
包含所有介面卡實現程式碼。它可以包含子包以按單個介面卡或技術組織介面卡程式碼。•config
包含用於連線不同元件的配置類。
包依賴規則:
•根包可以依賴於所有其他包。•config
包可以依賴於 core
和 adapters
。•adapters
可以依賴於 core
,但不可以依賴於 config
。•core
不得依賴於其他任何包。
希望這篇文章能夠幫助您更好地理解不同的程式碼結構。
引用連結
[1]
軟體架構模式。:
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024922/viewspace-2999234/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何優化我們的程式碼(vue專案)優化Vue
- 簡單的3步,重構我們的程式碼
- 使用這11個程式碼,可以大大地簡化我們的程式碼。
- 程式設計師如何保證我們的程式碼質量程式設計師
- 優化你的程式碼結構 --- MVP優化MVP
- 封裝我們的VBA程式碼封裝
- 我們是如何使用 Electron 構建 Linux 桌面應用程式的Linux
- 我們應該如何編寫高質量的前端程式碼前端
- “旁觀者效應”是如何毀掉我們的程式碼的
- 那些年我們用過的元件-結構化日誌元件 Serilog元件
- 請求支援,我們被非結構化資料包圍了!
- 簡化我們做後臺時對列表的篩選程式碼
- 黑客是如何知道我們常用的密碼的黑客密碼
- 我們正在錯誤的組織程式碼!
- 我們不需要程式碼之外的文件
- 我們的程式“猿”
- 我在工作中是如何優化程式碼的優化
- 如何組織軟體模組的程式碼結構?
- 我是如何自學資料結構的?資料結構
- java架構的程式碼結構Java架構
- 如何使用ABAP程式碼反序列化JSON字串成ABAP結構JSON字串
- Linkedin工程師是如何優化他們的Java程式碼的工程師優化Java
- 風口上的低程式碼:我們看到了這些變化與趨勢
- 如何讓我們的Android應用程式保活?Android
- 資料結構:快速排序程式碼(已優化)資料結構排序優化
- 資料結構之Stack | 讓我們一塊來學習資料結構資料結構
- 資料結構之Queue | 讓我們一塊來學習資料結構資料結構
- 資料結構之Set | 讓我們一塊來學習資料結構資料結構
- [Flutter翻譯]我們如何建設我們的Flutter團隊Flutter
- Caffe程式碼結構
- 使用 Go 優化我們的介面Go優化
- 資料結構之LinkedList | 讓我們一塊來學習資料結構資料結構
- 讓程式碼寫程式碼,自主程式設計的 AI 離我們還有多遠?程式設計AI
- 資料結構--單連結串列的建立和遍歷(程式碼優化)資料結構優化
- Button 的 "進化之旅" | 我們是如何設計 Compose API 的API
- 來我們探究一下net/http 的程式碼流程HTTP
- GitHub 新出的功能!可以幫我們自動寫程式碼Github
- 當我們談優化時,我們談些什麼優化