讀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
  • 就像 Web Api 介面可以對入參進行驗證,避免用戶傳入非法的或者不符合我們預期的參數一樣,選項也可以對配置源的內容進行驗證,避免配置中的值與選項類中的屬性不對應或者不滿足預期,畢竟大部分配置都是通過字元串的方式,驗證是很有必要的。 1. 註解驗證 像入參驗證一樣,選項驗證也可以通過特性註解方便地 ...
  • 原文作者:aircraft 原文鏈接:https://www.cnblogs.com/DOMLX/p/17270107.html 加工的泛型類如下: using System; using System.Collections.Generic; using System.IO; using Syst ...
  • 在前一篇文章,我們瞭解瞭如何通過.NET6+Quartz開發基於控制台應用程式的定時任務,今天繼續在之前的基礎上,進一步講解基於ASP.NET Core MVC+Quartz實現定時任務的可視化管理頁面,僅供學習分享使用,如有不足之處,還請指正。 涉及知識點 Quartz組件,關於Quartz組件的 ...
  • 面向對象1 面向對象,更在乎的結果,而過程的實現並不重要 IDea快捷鍵(基礎版) | 快捷鍵 | 作用 | | | | | ctrl + / | 快捷註釋 | | ctrl + shift + / | 多行註釋 | | ctrl + d | 快速複製 | | ctrl + shift + up/d ...
  • NX中的checkmate功能是用於檢查模型、圖紙數據的工具,在UGOPEN中有例子。手動操作可以檢查已載入的裝配下所有零部件,可以設置通過後保存模型,檢查結果保存到Teamcenter中,預設保存在零組件版本下。 代碼中可以設置多個檢查規則。相關設置可以在用戶預設設置中進行設置。 1 // 2 / ...
  • JavaSE 運算符 算術運算符:+,-,*,/,%,++(自增),--(自減) i++:先用後+1;++i:先+1後用 賦值運算符:= 擴展賦值運算符:+=,-=,*=,/= a+=b >a=a+b: ​ 可讀性差,但是編譯效率高,且會自動進行類型轉換; ​ 當ab為基本數據類型時,a+b和b+a ...
  • 面向對象2 訪問修飾符 | | private | default | protected | public | | | | | | | | 當前類 | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_che ...
  • 推薦一些學習qml教程 Qt官方的QML教程: https://doc.qt.io/qt-5/qtqml-index.html 這是一個由Qt官方提供的完整的QML教程,包含了所有基本知識和高級語法。 QML中文網:http://www.qmlcn.com/ 這是一個非常不錯的中文QML學習網站,提 ...
  • QAbstractBUtton: 所有按鈕控制項的基類 提供按鈕的通用功能 繼承自QWidget 屬於抽象類別,不能直接去使用,必須藉助於子類(除非你覺得子類不夠用,想自定義一個按鈕) 大部分功能之前已經使用過,在這裡只作簡單介紹 文本設置: setText(str) :設置按鈕提示文本 text() ...
  • 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。本篇介紹 VLD 配置文件中配置項 StartDisabled 的使用方法。 ...