The goal of software architecture is to minimize the human resources required to build and maintain the required system.
架構設計的目标: 用最小的人力來開發并維護需要的系統。
Every software system provides two different values to the stakeholders: behavior and structure.
軟體提供兩種價值:行為和結構
行為:軟體需要滿足要求,能夠工作。
結構:軟體需要便于改變,夠“軟”
程式設計範式:
structured programming
object-oriented programming
functional programming
structured programming
結構化程式設計
functional decomposition 劃分規模合理的程式塊,各程式塊完成相應部分任務,組合完成整體任務。
create falsifiable units of programming 建構可證僞的程式塊,便于測試。
Certain uses of goto statements prevent modules from being decomposed recursively into smaller and smaller units, thereby preventing use of the divide-and-conquer approach necessary for reasonable proofs.
Goto語句的使用,會妨礙将程式分解為更小的子產品,進而妨礙程式的分治和并歸過程。對軟體架構不利。是以不被推薦使用。
object-oriented programming
面向對象程式設計
Object, the combination of data and function. Object-oriented, a way to model the real world.
對象:資料和功能的結合體。
encapsulation, inheritance, and polymorphism
特點:封裝,繼承,多态
Part 2 Design Principles
Single Responsibility Principle (SRP)
A module should be responsible to one, and only one, actor.
一個子產品應該隻扮演一個角色,負責一種工作
Open-Closed Principle (OCP)
A software artifact should be open for extension but closed for modification.
軟體架構應該便于同類擴充,同時
Liskov Substitution Principle (LSP)
The Interface Segregation Principle (ISP)
The Dependency Inversion Principle (DIP)
依賴關系
原則:
The outer circles are mechanisms. The inner circles are policies.
外圈是實作,内圈是設計
This rule says that source code dependencies can only point inwards. Nothing in an inner circle can know anything at all about something in an outer circle.
依賴是由内向外單向的。内圈不存在對外圈的依賴。
Entities
Entities encapsulate enterprise wide business rules.
實體層:領域實體,封裝了領域對象在軟體中最抽象/一般化、高層次的規則。
這部分最不容易變更或受系統其它部分的影響。
如領域對象有哪些屬性,有哪些行為。
Use Cases
The software in this layer contains application specific business rules.
用例層:包含了軟體功能相關的業務規則。
如何操作/修改/組裝領域對象(entities),完成特定目的。
Interface Adapters
a set of adapters that convert data from the format most convenient for the use cases and entities, to the format most convenient for some external agency
接口擴充卡層: 資料轉換,将資料在便于use case層使用的格式和便于外層子產品(Frameworks and Drivers)使用的格式之間進行轉換。
如: MVC中的Controller,Gateways, Presenters
Frameworks and Drivers
The outermost layer is generally composed of frameworks and tools such as the Database, the Web Framework, etc
架構和驅動層:各種工具、庫的使用,所有具體細節的實作
如:DB, Devices, Web, UI, External Interfaces
設計上,依循DDD相關設計原則,采用Clean Architecture和微服務的架構,進行架構方面的設計。
實作上,用Gradle建構Spring Boot項目,使用Kotlin + Arrow庫來函數式程式設計,力求實作清晰的語義和良好的代碼結構。通過Docker打包,最終部署在aws的kubenates叢集上。
用Gradle建構,強制分子產品并用Clean Architecture架構按層分包,來限制開發人員實踐DDD和Clean Architecture。
Kotiln 面向開發者的JVM語言,提供相較于java更多的改進功能(Nullable Safety, coroutine, fp)和文法糖(scope method, sealed class, immutable object)
Arrow Kotlin 實作的FP庫,提供更清晰的語義(Either,Validate,fx)和良好的方法封裝等,能寫出更優雅的代碼
Spring Boot架構 主要是web應用。
在spring repository的基礎上二次封裝,使Repository提供Domain和Dto之間的轉化。讓開發者盡可能的把精力放在業務實作上。
測試上,單元測試,內建測試,合約測試等。mockito, mockk, pact等。
好處:
良好的架構,層次邏輯清晰,便于上手。
開發的時候,便于TDD開發。各子產品各層的測試好寫,隻關注子產品功能就夠了,對于其他代碼依賴也更友善用依賴反轉(dependency inversion)的方式進行隔離。測試好寫,覆寫全面,前期好開發,後期改動時出錯的可能性也更小了。
業務上有改動,也能盡量減少需要修改的部分。(資訊隔離,各子產品隻從其他子產品擷取必需的資料而非全部資料)
技術棧的改動,也因為有各良好的結構,把工作量盡量控制到最小。(資料庫的替換隻用改repository,UI的替換隻涉及前端)
需要實作multi tenant,multi teant 共用一個application server,就需要隔離各tenant之間的資訊。使用kotlin提供的immutable object 和 FP能夠減少人出錯的可能性。