讀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
  • @ 先看一下導出的整體效果(如下圖),其中標註的區域都是通過後臺動態生成的: 一、先在Word中建立好表格模板 1.1、參數創建方法(Word和WPS) 1.1.1、Office中Word域的創建 1.1.1.1、選中指定的單元格 -> 點擊頭部工具欄中的”插入“ -> 選擇 ”文檔部件“ -> 選 ...
  • 在實際工作中,經常會有一些需要定時操作的業務,如:定時發郵件,定時統計信息等內容,那麼如何實現才能使得我們的項目整齊劃一呢?本文通過一些簡單的小例子,簡述在.Net6+Quartz實現定時任務的一些基本操作,及相關知識介紹,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 紙殼CMS支持將評論、留言、表單提交、訂閱等通知,通過WebHook發送到第三方平臺,比如釘釘。 創建釘釘WebHook 需要在釘釘群中創建自定義機器人,具體方法可以參考釘釘的官方文檔: 自定義機器人接入 需要註意的是,在安全設置中不要使用加簽,使用自定義關鍵字即可。在發送的消息中,只要包含這個關鍵 ...
  • 向下轉型的使用 Java的多態性: 父類指向子類的聲明 Animal animal = new Dog()//Dog()重寫了父類Animal 有了對象的多態性以後,記憶體實際上載入的是==子類==的屬性和方法,但是由於變數聲明為==父類類型==,導致編譯時只能調用父類的屬性和方法,子類特有的屬性方法 ...
  • spring源碼環境搭建 組件 版本 jdk 1.8.0_192 spring-framework 5.3.x gradle 7.5.1 idea 2022.3.3 aspectJ 1.9 可根據spring-framwork項目說明靈活選擇 一、拉取spring-framework項目 1、spr ...
  • 首先任何的商業邏輯,光流量增長,沒法變現是沒用的。 就像博客群發提效工具,得有對應的用戶,更得有對應付費用戶群體的畫像。剩下的就是靠增長,被動讓他們找到你的產品,用產品解決他們痛點,他們自然而然會付費。 下麵大致分享下從三個方向分享下: 用戶痛點 -> 真正的付費用戶群體 產品價值 PLG 增長 一 ...
  • Object類的使用 Object類 Object類中的方法可以在網上搜索得到 Object類是所有java類的父類 如果類在聲明中未使用extends關鍵字指明其父類,則預設父類為java.lang.Object類 Object類中的功能(屬性、方法)具有通用性。 屬性:無 方法:equals() ...
  • Qt 源碼分析之moveToThread 這一次,我們來看Qt中關於將一個QObject對象移動至一個線程的函數moveToThread Qt使用線程的基本方法 首先,我們簡單的介紹一下在Qt中使用多線程的幾種方法: 重寫QThread的run函數,將要在多線程執行的任務放到run函數里 /*myt ...
  • 包裝類的使用 包裝類的使用 java提供8種基本數據類型對應的包裝類,使得基本數據類型變數具有類的特征 掌握:==基本數據類型、包裝類、String==三者之間的互相轉換 自動裝箱與自動拆箱==[基本數據類型和包裝類的轉換]== JDK5.0新特性,自動裝箱與自動拆箱。 class Test{ pu ...
  • 本文已經收錄到Github倉庫,該倉庫包含電腦基礎、Java基礎、多線程、JVM、資料庫、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分散式、微服務、設計模式、架構、校招社招分享等核心知識點,歡迎star~ Github地址 大家好,我是大彬~ 今天來聊聊接 ...