讀編程與類型系統筆記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
  • 前言 JSON Web Token(JWT)是一個非常輕巧的規範。這個規範允許我們使用 JWT 在用戶和伺服器之間傳遞安全可靠的信息。一個 JWT 實際上就是一個字元串,它由三部分組成,頭部、載荷與簽名。前兩部分需要經過 Base64 編碼,後一部分通過前兩部分 Base64 編碼後再加密而成。針對 ...
  • 一:背景 1. 講故事 今天本來想寫一篇 非托管泄露 的生產事故分析,但想著昨天就上了一篇非托管文章,連著寫也沒什麼意思,換個口味吧,剛好前些天有位朋友也找到我,說他們的拍攝監控軟體卡死了,讓我幫忙分析下為什麼會卡死,聽到這種軟體,讓我不禁想起了前些天 在程式員桌子上安裝監控 的新聞,參考如下: 我 ...
  • 文章目錄 介紹 ABP的依賴註入系統是基於Microsoft的依賴註入擴展庫(Microsoft.Extensions.DependencyInjection nuget包)開發的。所以我們採用dotnet自帶的註入方式也是支持的。 由於ABP是一個模塊化框架,因此每個模塊都定義它自己的服務併在它自 ...
  • 前言 外觀模式,英文名稱是:Facade Pattern。我們先從名字上來理解一下“外觀模式”。我看到了“外觀”這個詞語,就想到了“外表”這個詞語,兩者有著很相近的意思。就拿談戀愛來說,“外表”很重要,如果第一眼看著很舒服、有眼緣,那就有交往下去的可能。如果長的“三寸釘、枯樹皮”,估計就夠嗆了。在這 ...
  • 模擬.NET實際應用場景,綜合應用三個主要知識點:一是使用dnSpy反編譯第三庫及調試,二是使用Lib.Harmony庫實現第三庫攔截、偽造,三是實現同一個庫支持多版本同時引用。 ...
  • 通過strimzi部署的kafka集群,如何部署prometheus+grafana去監控呢?官方文檔信息量太大,即便照著做也可能失敗,這裡有一份詳細的保姆級操作指南,助您成功部署監控服務 ...
  • 在工具類中封裝getBean,使用哪個介面來實現 實事上,在工具類中,實現BeanFactoryPostProcessor和ApplicationContextAware介面後,使用它們構造方法里的對象ConfigurableListableBeanFactory和ApplicationContex ...
  • 1章:系統基礎信息模塊詳解 通過第三方模塊獲取伺服器的基本性能、塊設備、網卡介面、網路地址庫等信息。 1.1 系統性能模塊psutil:獲取系統性能信息、記憶體信息、磁碟信息、網路信息、用戶信息等。 1.2 IP地址處理模塊IPy: 處理IP地址,網段等。 1.3 DNS處理模塊dnspython: ...
  • EasyExcel動態表頭導出(支持多級表頭) 在很多業務場景中,都會應用到動態表頭的導出,也會涉及到多級表頭的導出,如下圖所示 通過EasyExcel,我們可以快速實現這一需求,具體代碼如下 DynamicHeader import java.util.List; /** *@Author: <a ...
  • 基於java線上婚紗定製系統設計與實現,可適用於線上婚紗攝影預定系統,基於web的婚紗影樓管理系統設計,基於web的婚紗影樓管理系統設計,婚紗攝影網系統,婚紗攝影網站系統,婚紗攝影網站系統,婚紗系統,婚紗管理系統等等; ...