讀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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...