讀Java實戰(第二版)筆記12_重構、測試和調試

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

進位之間的轉換 1.1 電腦硬體的基本認知 cpu: 中央處理器. 相當於人的大腦.運算中心,控制中心. 記憶體: 臨時存儲數據. 優點:讀取速度快。 缺點:容量小,造價高,斷電即消失. 硬碟: 長期存儲數據. 優點:容量大,造價相對低,斷電不消失。 缺點:讀取速度慢. 操作系統:統一管理電腦軟硬 ...


1. 設計模式

1.1. 對設計經驗的歸納總結

1.2. 一種可重用的藍圖

1.3. Java 5引入了for-each迴圈

1.3.1. 替代了很多顯式使用迭代器的情形

1.4. Java 7推出的菱形操作符(<>)

1.4.1. 幫助大家在創建實例時無須顯式使用泛型

1.4.2. 推動了Java程式員們採用類型介面(type interface)進行程式設計

1.5. 單例模式

1.5.1. 一般用於限制類的實例化,僅生成一份對象

1.6. 訪問者模式

1.6.1. 常用於分離程式的演算法和它的操作對象

2. 策略模式

2.1. 解決一類演算法的通用解決方案,你可以在運行時選擇使用哪種方案

2.2. 一個代表某個演算法的介面(Strategy介面)

2.3. 一個或多個該介面的具體實現,它們代表了演算法的多種實現

2.4. 一個或多個使用策略對象的客戶

2.5. Lambda表達式避免了採用策略設計模式時僵化的模板代碼

3. 模板方法模式

3.1. 如果需要採用某個演算法的框架,同時又希望有一定的靈活度,能對它的某些部分進行改進

3.2. “希望使用這個演算法,但是需要對其中的某些行進行改進,才能達到希望的效果”時是非常有用的

3.3. 通過傳遞Lambda表達式,直接插入不同的行為,不再需要繼承

3.4. Lamba表達式能幫助解決設計模式與生俱來的設計僵化問題

4. 觀察者模式

4.1. 消除僵化代碼

4.1.1. 直接傳遞Lambda表達式表示需要執行的行為即可

4.2. 某些事件發生時(比如狀態轉變),如果一個對象(通常稱之為主題)需要自動地通知其他多個對象(稱為觀察者)

5. 責任鏈模式

5.1. 通過定義一個代表處理對象的抽象類來實現的,在抽象類中會定義一個欄位來記錄後續對象

5.2. UnaryOperator的一個實例

5.2.1. 為了鏈接這些函數,需要使用andThen方法對其進行構造

6. 工廠模式

6.1. 無須向客戶暴露實例化的邏輯就能完成對象的創建

6.2. 特殊的函數介面TriFunction


          public interface TriFunction<T, U, V, R>{
              R apply(T t, U u, V v);
          }
          Map<String, TriFunction<Integer, Integer, String, Product>> map
              = new HashMap<>();

7. 改善程式代碼的可讀性

7.1. 代碼的可讀性

7.1.1. 別人理解這段代碼的難易程度

7.1.2. 確保你的代碼能非常容易地被包括自己在內的所有人理解和維護

7.2. 重構代碼,用Lambda表達式取代匿名類

7.3. 用方法引用重構Lambda表達式

7.4. 用Stream API重構命令式的數據處理

8. 從匿名類到Lambda表達式的轉換

8.1. “更簡潔”來描述Lambda表達式是因為相較於匿名類

8.2. 匿名類和Lambda表達式中的this和super的含義是不同的

8.2.1. 在匿名類中,this代表的是類自身

8.2.2. 在Lambda中,它代表的是包含類

8.3. 匿名類可以屏蔽包含類的變數

8.4. Lambda表達式不能(會導致編譯錯誤)

8.5. 涉及重載的上下文里,將匿名類轉換為Lambda表達式可能導致最終的代碼更加晦澀

8.5.1. 匿名類的類型是在初始化時確定的

8.5.2. Lambda的類型取決於它的上下文

8.5.3. Task嘗試使用顯式的類型轉換來解決這種模棱兩可的情況

8.5.4. NetBeans、Eclipse和IntelliJ都支持這種重構,能自動地幫你檢查,避免發生這些問題

9. 從Lambda表達式到方法引用的轉換

9.1. Lambda表達式非常適用於需要傳遞代碼片段的場景

9.2. 儘量將複雜的Lambda表達式抽象到普通方法中

9.3. 為了改善代碼的可讀性,請儘量使用方法引用

9.3.1. 利用這種方法能寫出非常簡潔的代碼

9.4. 儘量考慮使用靜態輔助方法

9.4.1. 比如comparing和maxBy

9.4.2. 這些方法設計之初就考慮了會結合方法引用一起使用

10. 從命令式的數據處理切換到Stream

10.1. Stream API能更清晰地表達數據處理管道的意圖

10.2. 建議將所有使用迭代器這種數據處理模式處理集合的代碼都轉換成Stream API的方式

10.3. 通過短路和延遲載入以及電腦的多核架構,可以對Stream進行優化

10.3.1. LambdaFicator

11. 增加代碼的靈活性

11.1. 採用函數介面

11.1.1. 沒有函數介面,就無法使用Lambda表達式

11.2. 有條件的延遲執行

11.2.1. 控制語句被混雜在業務邏輯代碼之中

11.2.2. 頻繁地從客戶端代碼去查詢一個對象的狀態,只是為了傳遞參數、調用該對象的一個方法,那麼可以考慮實現一個新的方法,以Lambda或者方法引用作為參數,新方法在檢查完該對象的狀態之後才調用原來的方法

11.2.3. 代碼會因此而變得更易讀(結構更清晰),封裝性更好(對象的狀態也不會暴露給客戶端代碼了)

11.3. 環繞執行

11.3.1. 擁有同樣的準備和清理階段

12. 測試Lambda表達式

12.1. 測試可見Lambda函數的行為

12.2. 測試使用Lambda的方法的行為

12.2.1. Lambda的初衷是將一部分邏輯封裝起來給另一個方法使用

12.2.2. 不應該將Lambda表達式聲明為public,它們僅是具體的實現細節

12.3. 將複雜的Lambda表達式分為不同的方法

12.3.1. 將Lambda表達式轉換為方法引用

12.3.2. 需要聲明一個新的常規方法

12.3.3. 用常規的方式對新的方法進行測試

12.4. 高階函數的測試

12.4.1. 如果一個方法接受Lambda表達式作為參數,那麼你可以採用的一個方案是使用不同的Lambda表達式對它進行測試

13. 調試

13.1. 查看棧跟蹤

13.1.1. 由於Lambda表達式沒有名字,因此它的棧跟蹤可能很難分析

13.2. 使用日誌調試

13.2.1. 流操作方法peek

13.2.2. peek的設計初衷就是在流的每個元素恢復運行之前,插入執行一個動作


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

-Advertisement-
Play Games
更多相關文章
  • 其他章節請看: react 高效高質量搭建後臺系統 系列 許可權 本系列已近尾聲,許可權是後臺系統必不可少的一部分,本篇首先分析spug項目中許可權的實現,最後在將許可權加入到我們的項目中來。 spug 中許可權的分析 許可權示例 比如我要將應用發佈模塊的查看許可權分給某用戶(例如 pjl),可以這樣操作: 在角 ...
  • 一、Vue 2 1、父組件向子組件傳值,使用 props:可以通過在子組件上綁定 props,然後在父組件中通過 v-bind 綁定相應的數據來傳遞數據。 父組件中的代碼: <template> <div> <child-component :prop-a="dataA"></child-compo ...
  • HTMLCollection 和 Nodelist 的異同? 1. w3 關於這兩者的定義 HTMLCollection: An HTMLCollection is a list of nodes. An individual node may be accessed by either ordin ...
  • 原文地址:我的稀土掘金 預設打包: 所有文件都放在了assets文件夾 期望: css,js.img等等進行歸類 解決辦法 vite.config.js build:{ rollupOptions:{ output:{ chunkFileNames: 'static/js/[name]-[hash] ...
  • 一 發新版本導致 問題的根源是伺服器js文件更新了,頁面還在請求以前的js文件。可以保留之前webpack打包的文件,但是時間久了文件體積會積累到很大,而且從產品角度更希望用戶訪問新的資源。所以最好的解決方式是在報錯時給用戶提示,用戶點擊確認後刷新頁面。前端如何能catch到這種錯誤? 目前還沒找到 ...
  • 直接上重點。 如果是定位不准,Web瀏覽器端, 1,要使用者必須要做個人認證或者企業認證,且通過審核。 2,請求的網頁必須是https協議。 3,請求的功能變數名稱必須是加入到應用的Referer白名單。進入到應用設置里查看。 4,申請的應用類型必須是瀏覽器端。且必須勾選對應的服務。 有時申請地圖服務的人和 ...
  • 談到java中的併發,我們就避不開線程之間的同步和協作問題,談到線程同步和協作我們就不能不談談jdk中提供的AbstractQueuedSynchronizer(翻譯過來就是抽象的隊列同步器)機制; (一)、AQS中的state和Node含義: AQS中提供了一個int volatile state ...
  • 組件設計是通過對功能及視覺表達中元素的拆解、歸納、重組,並基於可被覆用的目的,形成規範化的組件,通過多維度組合來構建整個設計方案,將這些組件整理在一起,便形成組件庫。本文我們主要講述基於Vant CLI的自建組件庫。Vant CLI 是一個基於 Vite 實現的 Vue 組件庫構建工具,通過 Van... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...