讀編程與類型系統筆記06_函數類型的高級應用

来源:https://www.cnblogs.com/lying7/archive/2023/01/13/17048493.html
-Advertisement-
Play Games

摘要:跨域,對後端工程師來說,可謂既熟悉又陌生。 本文分享自華為雲社區《後端老司機的跨域之旅》,作者: 勇哥java實戰分享。 跨域,對後端工程師來說,可謂既熟悉又陌生。 這兩個月我以架構師的角色參與一款教育產品的孵化,有了一段難忘的跨域之旅。 寫這篇文章,我想分享我在跨域這個知識點的經歷和思考,希 ...


1. 裝飾器模式

1.1. 擴展對象的行為,而不必修改對象的類

1.2. 裝飾的對象可以執行其原始實現沒有提供的功能

1.3. 優勢

1.3.1. 支持單一職責原則

1.3.1.1. 每個類只應該承擔一種職責

1.4. 經典實現

1.4.1. 一個IComponent介面

1.4.2. 一個具體實現,即ConcreteComponent

1.4.3. 使用額外行為來增強IComponent的Decorator

1.4.3.1. 例如:添加單例行為

1.4.4. 特點

1.4.4.1. 一個介面

1.4.4.1.1. 介面聲明瞭多個方法,就無法使用一個函數類型來替代介面

1.4.4.2. 兩個類

1.4.4.3. 每個類一個方法

1.4.4.3.1. 具體操作
1.4.4.3.2. 裝飾器

1.5. 函數裝飾器

1.5.1. 介面改為一個函數類型

1.5.1.1. 示例:該類型的函數不接受實參,返回一個Widget:() => Widget

1.5.2. 一個具體實現的類替換為簡單函數

1.5.3. 一個新函數singletonDecorator()

1.5.3.1. 接受一個WidgetFactory類型的函數

1.5.3.2. 返回另外一個WidgetFactory類型的函數

1.5.3.3. 採用lambda實現

1.5.4. 特點

1.5.4.1. 一個函數類型

1.5.4.1.1. 工廠函數類型

1.5.4.2. 兩個函數

1.5.4.2.1. 工廠函數
1.5.4.2.2. 裝飾器函數

1.6. 閉包

1.6.1. lambda捕獲

1.6.1.1. lambda內捕獲的一個外部變數

1.6.2. 編程語言通過閉包來實現lambda捕獲

1.6.3. 閉包記錄了創建該函數時的環境

1.6.3.1. 可以在不同調用之間維護狀態

1.6.4. lambda引用了函數的局部變數

1.6.4.1. 其生存期將大於創建它的函數

1.6.4.2. 函數的局部變數在調用函數時創建,在函數返回時銷毀

1.6.5. 保留了其外層函數的一些狀態信息的lambda

1.6.6. 只有存在高階函數,閉包才有意義

1.6.6.1. 不能從一個函數中返回另一個函數,就不存在要捕獲的環境

1.6.6.2. 所有函數都在全局作用域內,所以全局作用域就是它們的環境

1.6.6.2.1. 函數只能引用全局變數

1.6.7. 對象代表一組方法的某個狀態

1.6.8. 閉包則代表捕獲到某個狀態的函數

2. 計數器

2.1. 全局計數器

2.1.1. 一個引用全局變數的簡單函數

2.1.2. 缺點

2.1.2.1. 計數器的值沒有被恰當封裝

2.1.2.2. 不能使用計數器的兩個獨立的實例

2.2. 面向對象的計數器

2.2.1. 多個獨立的計數器

2.3. 函數式計數器

2.3.1. 代碼比面向對象版本的更加簡潔

2.4. 可恢復的計數器

2.4.1. 可恢復的函數

2.4.1.1. 跟蹤自己狀態的函數,在被調用時,不會從頭運行,而是從上一次返回時所在的狀態恢復執行

2.4.2. 不使用關鍵字return來退出函數

2.4.3. 使用關鍵字yield

2.4.3.1. 必須把函數聲明為一個生成器

2.4.3.2. 其返回類型必須是可迭代的迭代器

2.4.3.3. 在函數名稱的前面加上星號來聲明生成器

2.4.4. TypeScript語法

2.4.5. 生成器通過特殊語法來創建可恢復的函數

2.4.6. 生成器不是返回控制權,而是交出控制權

3. 非同步

3.1. 按順序運行代碼可能導致不可接受的延遲

3.2. 回調

3.2.1. 作為實參提供給非同步函數的一個函數

3.2.2. 也可以從非同步函數那裡收到實參

3.3. 非同步執行模型

3.3.1. 線程

3.3.2. 事件迴圈

3.3.2.1. 使用一個隊列

3.3.2.2. 非同步函數將被加入隊列

3.3.2.3. 它們自己也可以將其他函數排隊

3.3.2.4. 只要隊列不為空,隊列中的第一個函數就將被取出來執行

3.3.2.5. 優點

3.3.2.5.1. I/O操作等待數據時讓它們排隊的效果很好
3.3.2.5.2. 不需要同步,因為所有代碼在一個線程上運行

3.3.2.6. 缺點

3.3.2.6.1. 對於運行時間長,但是不能被拆分為多個操作的任務,效果不好
3.3.2.6.2. CPU密集的操作會造成阻塞
3.3.2.6.2.1. CPU密集的操作(如複雜計算)不能被排隊
3.3.2.6.2.2. 需要CPU周期
3.3.2.6.2.3. 沒有等待數據

3.4. 簡化非同步代碼

3.4.1. promise

3.4.1.1. 將來某個時刻可用的值的一個代理

3.4.1.2. 在生成該值的代碼運行之前,其他代碼可以使用該promise設置在該值可用後如何處理該值,在發生錯誤時如何處理,甚至取消將來的執行

3.4.1.3. 讓代碼的可讀性相比使用回調時更好

3.4.1.4. 狀態

3.4.1.4.1. 等待(pending)
3.4.1.4.1.1. 已被創建,但還沒有完成
3.4.1.4.2. 完成(settled)
3.4.1.4.2.1. 已經調用了,並提供了一個值,此時將調用continuation
3.4.1.4.3. 拒絕(rejected)
3.4.1.4.3.1. 調用reject()或者拋出錯誤

3.4.1.4.3.1.1. 當前的promise會被拒絕

3.4.1.4.3.1.2. 通過then()鏈接到該promise的其他所有promise都會被拒絕

3.4.1.5. 組合promise

3.4.1.5.1. Promise.all()
3.4.1.5.1.1. 一組promise作為實參
3.4.1.5.1.2. 返回當提供的所有promise都完成後完成的一個promise
3.4.1.5.2. Promise.race()
3.4.1.5.2.1. 一組promise作為實參
3.4.1.5.2.2. 返回當提供的任何一個promise完成時完成的一個promise

3.4.2. continuation

3.4.2.1. 在promise的結果可用後調用的函數

3.4.2.2. 並非必須返回一個promise

3.4.2.2.1. 不是總會鏈接非同步函數
3.4.2.2.2. 可以同步執行
3.4.2.2.3. 自動轉換為Promise

3.4.2.3. 每個continuation放到一個單獨的函數中,並通過then()把它們鏈接起來

3.4.3. 函數promise提供給我們某個類型T的值,以及指定從T到其他某個類型U的函數((value: T)=> U)的能力,當承諾被履行,我們得到了值以後,將調用這個函數(它就是continuation)

3.4.4. JavaScript(及TypeScript)採用Promise類型實現

3.4.5. C#採用Task實現

3.4.6. JAVA採用CompletableFuture實現

3.4.7. async/await

3.4.7.1. 代碼的可讀性更好

3.4.7.1.1. 非同步代碼讀起來類似於同步代碼

3.4.7.2. 把所有代碼寫到一個函數中,每當調用另外一個返回promise的函數,就等待(await)其結果,然後在得到結果後繼續執行

3.4.7.3. 異常將從await調用拋出,可在try/catch語句中捕獲

3.4.7.4. 不使用then()提供continuation

3.4.7.5. 語法糖


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

-Advertisement-
Play Games
更多相關文章
  • 摘要:輸入網址並點回車,後臺到底發生了什麼。透析 HTTP 協議與 TCP 連接之間的千絲萬縷的關係。掌握為何是三次握手四次揮手?time_wait 存在的意義是什麼?全面圖解重點問題,再也不用擔心面試問這個問題。 本文分享自華為雲社區《輸入網址,小手一點,後面到底發生了什麼?》,作者:龍哥手記。 ...
  • 1.按鈕點擊後添加loading,介面返回成功後再移除loading(經過多次嘗試發現,此方法不能完全確保只調用一次介面,第二次添加時仍會多次調用介面),方法如下: html代碼: <el-button @click="onSave" :loading="onLoading">保存</el-butt ...
  • JavaScript 中,對於普通對象,不能直接使用 length 來獲取對象的長度,因為 JavaScript 對象並不是一種有序的集合,沒有長度的概念。 對於數組或者類數組對象,可以使用 .length 來獲取它們的長度,因為它們是有序集合。 對於字元串也可以使用.length來獲取長度,因為字... ...
  • 我們是袋鼠雲數棧 UED 團隊,致力於打造優秀的一站式數據中台產品。我們始終保持工匠精神,探索前端道路,為社區積累並傳播經驗價值。 前言 訪問控制(Access control)是指對訪問者向受保護資源進行訪問操作的控制管理。該控制管理保證被授權者可訪問受保護資源,未被授權者不能訪問受保護資源。 現 ...
  • 在 CSS 中,倒影是一種比較常見的效果。今天,我們就將嘗試,使用 CSS 完成各類不同的倒影效果,話不多說,直接進入主題。 實現倒影的兩種方式 首先,快速過一下在 CSS 中,實現倒影的 2 種方式。 使用 -webkit-box-reflect 正常而言,-webkit-box-reflect ...
  • 基於AWS雲SaaS多租戶架構設計租戶與用戶概念單租戶與多租戶多租戶的好處 採用多租戶架構方法將為你的SaaS應用程式帶來廣泛的有價值的好處。 讓我們來看看下麵的貢獻。 a) 利用多租戶架構策略,減少伺服器基礎設施成本。 與其為每個客戶創建一個SaaS環境,不如為所有客戶提供一個應用環境。這使你的A ...
  • 隨著互聯網的發展,用戶在使用網路時對網站的瀏覽速度和效果愈加重視,但由於網民數量激增,網路訪問路徑過長,從 而使用戶的訪問質量受到嚴重影響。特別是當用戶與網站之間的鏈路被突發的大流量數據擁塞時,對於異地互聯網用戶急速增加的地區來說,訪問質量不良更是一個 急待解決的問題。如何才能讓各地的用戶都能夠進行 ...
  • 作為一個後端研發人員,開發服務介面是我正常不過的工作了,這些介面不管是面向前端HTTP或者是供其他服務RPC遠程調用的,都繞不開一個共同的話題就是“高可用”,介面開發往往看似簡單,但保證高可用這塊實現起來卻不並沒有想想的那麼容易,接下來我們就看一下,一個高可用的介面是該考慮哪些內容,同時文中有不足的... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...