讀Java8函數式編程筆記07_設計和架構的原則

来源:https://www.cnblogs.com/lying7/archive/2023/02/01/17082131.html
-Advertisement-
Play Games

簡介 在文章《GraalVM和Spring Native嘗鮮,一步步讓Springboot啟動飛起來,66ms完成啟動》中,我們介紹瞭如何使用Spring Native和buildtools插件,打包出本地鏡像,也打包成Docker鏡像。本文探索一下,如果不通過這個插件來生成鏡像。這樣我們可以控制更 ...


1. SOLID原則

1.1. 開發良好面向對象程式的準則

1.2. Liskov substitution里氏替換

1.3. Interface segregation介面隔離

1.4. Single responsibility單一功能原則

1.4.1. 程式中的類或方法只能有一個改變的理由

1.4.2. 一個類不僅要功能單一,而且還需將功能封裝好

1.5. Open/closed開閉原則

1.5.1. 軟體應該對擴展開放,對修改閉合

1.5.1.1. 讓軟體易於修改

1.5.2. 高階函數在用多態來實現開閉原則

1.5.3. 使用不可變對象實現開閉原則

1.6. Dependency inversion依賴反轉原則

1.6.1. 抽象不應依賴細節,細節應該依賴抽象

1.6.1.1. 待依賴的抽象不必是介面

1.6.2. 讓程式員脫離底層粘合代碼,編寫上層業務邏輯代碼

1.6.3. 高階函數提供了反轉控制

1.6.4. 模塊化和重用方式是雙向的

1.6.4.1. 可以替換不同的細節重用上層代碼

1.6.4.2. 可以替換不同的業務邏輯重用細節的實現

2. 不可變性

2.1. 觀測不可變性

2.1.1. 在其他對象看來,該類是不可變的

2.1.2. java.lang.String

2.1.2.1. 第一次調用hashCode方法時緩存了生成的散列值

2.1.3. 觀測不可變性不意味著實現不可變性

2.2. 實現不可變性

2.2.1. 對象本身不可變

2.2.2. 實現不可變性意味著觀測不可變性

3. 設計模式

3.1. 有些模式會變得過時

3.2. Lambda能讓很多現有設計模式更簡單、可讀性更強

3.2.1. 將大量代碼塞進一個方法會讓可讀性變差是決定如何使用Lambda表達式的黃金法則

4. 單例模式

4.1. 應該避免使用的模式

4.2. 敏捷開發使其成了一個反模式

5. 命令者模式

5.1. 命令者是一個對象,它封裝了調用另一個方法的所有細節

5.2. 使用該對象,可以編寫出根據運行期條件,順序調用方法的一般化代碼

5.3. 函數介面Runnable

5.4. 巨集只是使用命令者模式的一個例子,它被大量用在實現組件化的圖形界面系統、撤銷功能、線程池、事務和嚮導中

5.5. 使用Lambda表達式或是方法引用,能讓代碼更簡潔,去除了大量樣板代碼,讓代碼意圖更加明顯

6. 策略模式

6.1. 能在運行時改變軟體的演算法行為

6.2. 定義一個通用的問題,使用不同的演算法來實現,然後將這些演算法都封裝在一個統一介面的背後

6.3. 使用Lambda表達式或者方法引用可以去掉樣板代碼

7. 觀察者模式

7.1. 可被Lambda表達式簡化和改進的行為模式

7.2. 被觀察者持有一個觀察者列表。當被觀察者的狀態發生改變,會通知觀察者。

7.3. 觀察者模式被大量應用於基於MVC的GUI工具中,以此讓模型狀態發生變化時,自動刷新視圖模塊,達到二者之間的解耦

8. 模板方法模式

8.1. 整體演算法的設計是一個抽象類,它有一系列抽象方法,代表演算法中可被定製的步驟,同時這個類中包含了一些通用代碼

8.2. 演算法的每一個變種由具體的類實現,它們重寫了抽象方法,提供了相應的實現

8.3. 將一組方法調用按一定順序組織起來

8.4. 如果用函數介面表示函數,用Lambda表達式或者方法引用實現這些介面,相比使用繼承構建演算法,就會得到極大的靈活性

8.4.1. 使用函數介面實現方法並沒有排除繼承的方式

9. 領域專用語言(DSL)

9.1. 針對軟體系統中某特定部分的編程語言

9.1.1. 比較小巧

9.1.2. 表達能力也不如通用語言強

9.1.3. 不求面面俱到,但求有所專長

9.2. Domain-Specific Languages

9.2.1. Martin Fowler和Rebecca Parsons合著

9.2.2. Addison-Wesley出版社出版

9.3. 外部DSL

9.3.1. 脫離程式源碼編寫,然後單獨解析和實現

9.3.2. 例如

9.3.2.1. 級聯樣式表(CSS)

9.3.2.2. 正則表達式

9.4. 內部DSL

9.4.1. 嵌入編寫它們的編程語言中

9.4.2. 普通的類庫,提供API方便使用

9.4.3. 例如

9.4.3.1. JMock

9.4.3.2. Mockito

9.4.3.3. JOOQ

9.4.3.4. Querydsl

10. 行為驅動開發(BDD)

10.1. 測試驅動開發(TDD)的一個變種

10.2. 它的重點是描述程式的行為,而非一組需要通過的單元測試


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文描述的是查找字典的某一個元素(字典遍歷元素請點擊->這裡) 上下文代碼 smart_girl = {"name":"yuan wai", "age": 25,"sex":"女"} 第一種方式:[] 註意:這種方式,如果找不到對應的key,會報一個KeyError錯誤 smart_girl["na ...
  • 日期類 一、第一代日期類 Date Date:第一代日期類,精確到毫秒,代表特定的瞬間。 SimpleDateFormat:格式化和解析日期的具體類。它允許進行格式化(日期 -> 文本)、解析(文本 -> 日期)和規範化。 SimpleDateFormat日期-時間格式模式參數: | Letter ...
  • 1. 前言 WebMvcConfigurer配置類其實是Spring內部的一種配置方式,採用JavaBean的形式來代替傳統的xml配置文件形式進行針對框架個性化定製,可以自定義一些Handler,Interceptor,ViewResolver,MessageConverter。基於java-ba ...
  • 使用apidoc包生成apidoc的json格式數據,然後使用python讀取出介面地址、名字、組名、輸入參數格式和例子、輸出參數格式和例子等,然後根據swagger格式填入對應的數據即可生成swagger的json格式 ...
  • 前言 用於實現通過牌子逆向查主播信息這個功能。 插件基於Nonebot2開發,鏈接:https://github.com/Ikaros-521/nonebot_plugin_searchBiliInfo 工程下載 github:https://github.com/Ikaros-521/get_bi ...
  • 首先要瞭解的是,1、功能變數名稱註冊 2、功能變數名稱解析,是兩個獨立的產品。一般情況下,功能變數名稱服務商(萬網、新網等)會提供一站式服務,既提供“功能變數名稱購買註冊”,又提供“功能變數名稱解析服務”。 但實際上,功能變數名稱和功能變數名稱解析是可以分開部署的,功能變數名稱服務商也支持相關的分離設置。比如:功能變數名稱在萬網進行管理,功能變數名稱解析可以指向其他功能變數名稱服務商... ...
  • 多態就是指程式中定義的引用變數所指向的具體類型和通過該引用變數發出的方法調用在編譯時並不確定,而是在程式運行期間才確定。 即一個引用變數倒底會指向哪個類的實例對象,該引用變數發出的方法調用到底是哪個類中實現的方法,必須在由程式運行期間才能決定。 因為在程式運行時才確定具體的類,這樣,不用修改源程式代 ...
  • 索引(index)是幫助MySQL高效獲取數據的數據結構(有序)。在數據之外,資料庫系統還維護著滿足 特定查找演算法的數據結構,這些數據結構以某種方式引用(指向)數據, 這樣就可以在這些數據結構 上實現高級查找演算法,這種數據結構就是索引。 優缺點: 優點: 提高數據檢索效率,降低資料庫的IO成本 通過 ...
一周排行
    -Advertisement-
    Play Games
  • 一個自定義WPF窗體的解決方案,借鑒了呂毅老師的WPF製作高性能的透明背景的異形視窗一文,併在此基礎上增加了滑鼠穿透的功能。可以使得透明窗體的滑鼠事件穿透到下層,在下層窗體中響應。 ...
  • 在C#中使用RabbitMQ做個簡單的發送郵件小項目 前言 好久沒有做項目了,這次做一個發送郵件的小項目。發郵件是一個比較耗時的操作,之前在我的個人博客裡面回覆評論和友鏈申請是會通過發送郵件來通知對方的,不過當時只是簡單的進行了非同步操作。 那麼這次來使用RabbitMQ去統一發送郵件,我的想法是通過 ...
  • 當你使用Edge等瀏覽器或系統軟體播放媒體時,Windows控制中心就會出現相應的媒體信息以及控制播放的功能,如圖。 SMTC (SystemMediaTransportControls) 是一個Windows App SDK (舊為UWP) 中提供的一個API,用於與系統媒體交互。接入SMTC的好 ...
  • 最近在微軟商店,官方上架了新款Win11風格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,這款應用引入了前沿的Fluent Design UI設計,為用戶帶來全新的視覺體驗。 ...
  • 1.簡單使用實例 1.1 添加log4net.dll的引用。 在NuGet程式包中搜索log4net並添加,此次我所用版本為2.0.17。如下圖: 1.2 添加配置文件 右鍵項目,添加新建項,搜索選擇應用程式配置文件,命名為log4net.config,步驟如下圖: 1.2.1 log4net.co ...
  • 之前也分享過 Swashbuckle.AspNetCore 的使用,不過版本比較老了,本次演示用的示例版本為 .net core 8.0,從安裝使用開始,到根據命名空間分組顯示,十分的有用 ...
  • 在 Visual Studio 中,至少可以創建三種不同類型的類庫: 類庫(.NET Framework) 類庫(.NET 標準) 類庫 (.NET Core) 雖然第一種是我們多年來一直在使用的,但一直感到困惑的一個主要問題是何時使用 .NET Standard 和 .NET Core 類庫類型。 ...
  • WPF的按鈕提供了Template模板,可以通過修改Template模板中的內容對按鈕的樣式進行自定義。結合資源字典,可以將自定義資源在xaml視窗、自定義控制項或者整個App當中調用 ...
  • 實現了一個支持長短按得按鈕組件,單擊可以觸發Click事件,長按可以觸發LongPressed事件,長按鬆開時觸發LongClick事件。還可以和自定義外觀相結合,實現自定義的按鈕外形。 ...
  • 一、WTM是什麼 WalkingTec.Mvvm框架(簡稱WTM)最早開發與2013年,基於Asp.net MVC3 和 最早的Entity Framework, 當初主要是為瞭解決公司內部開發效率低,代碼風格不統一的問題。2017年9月,將代碼移植到了.Net Core上,併進行了深度優化和重構, ...