讀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
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...