讀編程與類型系統筆記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
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...