函數式編程:Flutter&Dart中的組合

来源:https://www.cnblogs.com/xuge2it/archive/2023/02/14/17118706.html
-Advertisement-
Play Games

本文翻譯自: Composition in Flutter & Dart 在 Flutter & Dart 中使用組合創建模塊化應用程式。 什麼是組合? 在dictionary.com 中 composition 的定義為:將部分或者元素組合成一個整體的行為。簡單說,組合就像堆樂高積木,我們可以將積 ...


本文翻譯自: Composition in Flutter & Dart

在 Flutter & Dart 中使用組合創建模塊化應用程式。

image.png

什麼是組合?

在dictionary.com 中 composition 的定義為:將部分或者元素組合成一個整體的行為。簡單說,組合就像堆樂高積木,我們可以將積木組合成一個結構。

在 FP 中,我們定義了一個簡單的通用函數,該函數可以通過組合構成一個複雜的函數,一個函數的輸出是另外一個函數的輸入,依此類推。輸入從一個函數傳遞到另外一個函數最後返回結果。因此,組合可以認為是數據流動的管道。

組合的數字元號是 f.g。 f(g(x))它從裡向外執行。

  1. 首先 x 初始化。
  2. 將 x 作為參數傳遞給 g,g(x)被初始化。
  3. g(x)被計算並將結果傳遞給 f 函數,最後 f(g(x))被計算。

在 Dart 中,組合函數可以表示如下:

image.png

Compose 是個高階函數,它接收兩個函數並返回一個可接收輸入的函數。 組合的執行順序是從右到左,因此g先執行,然後再執行f

image.png

如上圖創建了函數shout,它由兩個較小的功能函數toUpperexclaim組成。

第 4 行,組合這兩個函數創建shout函數.

第 8 行使用了包Dartz中提供的函數composeF

Flutter 中如何使用組合?

Flutter 框架是展示組合功能的最佳示例之一,我們組合控制項來進行UI設計。比如你想設置 padding,可以用Padding來組合,你想設置一些裝飾,可以用DecoratedBox來進行組合等等。

Flutter 大量使用了組合。控制項樹就是我們用組合處理 UI 的結果.控制項就像樂高積木,小的通用控制項可以被組合成複雜的控制項或者用戶界面。比如,Container就包含了幾個控制項,如PaddingDecoratedBoxAlignLimitedBox等。

這裡偏重介紹組合在實踐中應用讓讀者更深刻理解組合概念,本質上來說Flutter中的控制項組合與函數式編程中的組合還是有點區別,兩則編程範式不一樣,Flutter 控制項間組合偏重於面向對象編程,對象是基本單元,控制項都是對象;而函數的組合偏重於函數式編程,無狀態函數是基本單元。

組合與管道

與 compose 類似,這裡介紹另外一個概念:管道。兩者區別在於組合執行順序是從右到左,而管道執行順序是從左至右

這個區別尤為重要,不要忽視,它間接影響到代碼可讀性。中國人的閱讀習慣是從左到右的,如果你是阿拉伯人可以忽略我說的,哈哈!

image.png

在第 14 行,使用了 compose,它的執行順序是從右至左,函數 g 首先執行,結果傳遞給 f 。

在第 17 行,使用了管道,它的執行順序是從左至右,函數 f 先執行,結果傳遞給 g 。

如果使用 compose,輸入 10 先執行increment 增加到 11 然後乘以 2,因此執行結果是 22.

如果使用管道,輸入 10 先執行doubler乘以 2 變成 20,然後執行increment遞增到 21 並返回。

Example 示例

結合所學的概念,我們可以創建幾個函數,實現字元串的變換。

image.png

我們需要可以將上述用例相互轉換的函數。

就像樂高游戲一樣,首先需要樂高積木,在這個例子中我們需要具有一些基礎功能的函數。

image.png

之前定義的 Compose 函數只接收兩個函數作為參數,現在定義一個可以接收 n 個參數的函數。

image.png

我們創建瞭如上代碼,接下來可以用它來實現更有意思的函數,這些函數將被使用,通過Github 倉庫查找更多信息。

Snake case to Pascal case

接下來將從 Snake case 轉換成 camel,pascal 和 kebab cases。
image.png

const _pascalCase = 'LoremIpsumDolorSitAmet';

const _snakeCase = 'lorem_ipsum_dolor_sit_amet';

在第 5 行中,定義了_snakeToPascal  函數,它接收一個參數並返回結果。_snakeToPascal由三個小函數組合而成:splitWithUnderscorecapitalizeWords和  joinWithoutSpace 。將“lorem_ipsum_dolor_sit_amet”作為參數傳入函數中,compose 是從右至左的執行順序。因此:

  1. 首先輸入字元串先傳給splitWithUnderscore,該函數將輸入拆分成 [“lorem”, “ipsum”, “dolor”, “sit”, “amet”]

  2. splitWithUnderscore的返回值是一個數組,它將被傳遞給第二個函數,即capitalizeWords將每個元素的首字母轉換成大寫並返回列表 [“Lorem”, “Ipsum”, “Dolor”, “Sit”, “Amet”]

  3. capitalizeWords的返回結果將被傳遞給  joinWithoutSpace,該函數將元素連接在一起並返回結果 “LoremIpsumDolorSitAmet”

還記得我們之前講的麽? 我們通過組合為數據定義一個管道,像上面這樣。數據流通過這些管道並返回結果,花些時間來構建一些基礎功能函數,組合他們生成更有意義的函數就變得很容易了。

Snake case to Camel case

const _snakeCase = 'lorem_ipsum_dolor_sit_amet';

const _camelCase = 'loremIpsumDolorSitAmet';

第 15 行_snakeToCamel非常簡單,第一個與最後一個函數都是與上面轉換都是相同的:splitWithUnderscore  和  joinWithoutSpace,將中間函數從capitalizeWords  修改為  capitalizeTail,我們的功能就實現了。原因是 camelCase 的情況下不需要將第一個單詞大寫。capitalizeTailcapitalizeWords類似,但是它忽略了第一個單詞處理,匹配了我們的用例。

Snake case to Kebab case

Snake case 轉換成 kebab case 更簡單.只需要組合兩個函數 (splitWithUnderscore & joinWithHyphen),就可以完成任務。

Camel case to other cases

image.png

Kebab case to other cases

image.png

Pascal case to other cases

image.png

想法

我喜歡將組合視為一種分治技術。組合的主要優點是得到高復用和可定製功能。

文中源碼地址  GitHub

太棒了!鼓勵自己堅持到底。我希望我為你投入的時間增加了一些價值。

如果覺得文章對你有幫助,點贊、收藏、關註、評論,一鍵四連支持,你的支持就是我創作最大的動力。

❤️ 本文原創聽蟬 公眾號:碼里特別有禪 歡迎關註原創技術文章第一時間推送 ❤️


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

-Advertisement-
Play Games
更多相關文章
  • sql語氣查詢去重的兩種方法 以下兩種都可以進行去重查詢,區別是: 用distinct去重,只能查詢到去重的屬性那一列,無法查詢其他欄位 用group by分組查詢,可以根據需求查詢對應的其他欄位,推薦用group by 第一種:使用distinct(關鍵詞distinct用於返回唯一不同的值) s ...
  • 摘要:華為LakeFormation是企業級的一站式湖倉構建服務。 本文分享自華為雲社區《華為雲MRS支持LakeFormation能力,打造一站式湖倉,釋放數據價值】》,作者:breakDawn 。 1 背景 1.1 數倉和數據湖的概念 數據分析技術在2010~2019年間,以湖倉兩層架構技術作為 ...
  • 想必大家在版本更新迭代中,不免需要對資料庫表的欄位進行修改欄位類型或者長度的情況, 如果是修改存儲過程或者自定義函數, 那還是很好改的, 不用擔心表功能收到影響. 如果是改欄位呢? 首先要判斷欄位是不是已經在系統裡面, 沒有的話, 需要新增上去, 有的話, 需不需要修改? 其次, 腳本如果報錯, 是 ...
  • ChunJun是一個開始於2018年的批流一體數據集成框架項目,原名FlinkX。2022年2月22日,在FlinkX進行初版開源的整整四年後,技術團隊決定對FlinkX進行整體升級,並更名為ChunJun,希望為大家真正提供一個穩定、高效、易用的批流一體的數據集成框架。 2022年的ChunJun ...
  • 摘要:通常跑批加工場景下,都是大數量做關聯操作,通常不建議使用索引。有些時候因為計劃誤判導致使用索引的可能會導致嚴重的性能問題。本文從一個典型的索引導致性能的場景重發,剖析此類問題的特征,定位方法和解決方法 本文分享自華為雲社區《GaussDB(DWS)性能調優:indexscan導致的性能問題識別 ...
  • JUC提供的鎖機制,可以保證在同一個JVM進程中同一時刻只有一個線程執行操作邏輯; 多服務多節點的情況下,就意味著有多個JVM進程,要做到這樣,就需要有一個中間人; 分散式鎖就是用來保證在同一時刻,僅有一個JVM進程中的一個線程在執行操作邏輯; 換句話說,JUC的鎖和分散式鎖都是一種保護系統資... ...
  • 你想要的 ClickHouse 優化,都在這裡。 ClickHouse 是 OLAP(Online analytical processing)資料庫,以速度見長[1]。ClickHouse 為什麼能這麼快?有兩點原因[2]: 架構優越 列式存儲 索引 數據壓縮 向量化執行 資源利用 關註底層細節... ...
  • mysql日誌種類 錯誤日誌 二進位日誌 查詢日誌 慢查詢日誌 日誌 錯誤日誌 錯誤日誌是mysql中最重要的日誌之一,它記錄了當mysqld啟動和停止時,以及伺服器在運行過程中發生任何嚴重錯誤時的相關信息,當資料庫出現任何故障導致無法正常使用時,建議首先查看此日誌。 該日誌是預設開啟的,預設存放目 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...