好 pipe 不用嗎?(. ❛ ᴗ ❛.),讓程式碼更簡潔彈性吧!

更新於 2024/08/26閱讀時間約 8 分鐘
raw-image
鱈魚的魚缸搬家了!新家文章有重新修訂,歡迎來新家看看喔。(´▽`ʃ♡ƪ)

甚麼是 pipe

顧名思是就是水管,但是不會像瑪利歐由人來鑽,而是讓資料通過。

pipe 是一種函數式程式設計中的概念,用來表示一條資料處理的管道。

可以將多個 function 組合在一起,資料會依序經過每個 function 進行處理。

這種方法使程式碼更加清晰、模組化,並且易於維護。

個人覺得和以往指令式的寫法最大差別在於關注點不同。

怎麼說呢?讓我們看看以下兩種等效的程式。

例 1:

const data = [1, 2, 3];
const filteredData = data.filter(value => value > 1);
const result = filteredData.join('-');

例 2:

const result = pipe(
[1, 2, 3],
filter(value => value > 1),
join('-'),
);
我知道你很想問例 1 明明可以一行解決。
先別計較那麼多,只是簡單範例啦。( •̀ ω •́ )✧


可以注意到例 1 的專注點在「結果」,而例 2 的寫法專注點在「過程」,了解差異後學習轉換上就會相對容易了。(應該啦 ¯\( ͡° ͜ʖ ͡°)/¯)

ramda、remeda?

這兩個都是基於 FP 概念設計的優秀套件,其實選一個喜歡的都行。

如果問我到底要用哪一個?實務上我 2 個都用。ヽ(✿゚ ▽゚)ノ

不過主要使用 remeda,remeda 缺少的 function 從 ramda 補。

為甚麼主要用 remeda 呢?因為 remeda 可以完美配合 TypeScript,而且同時支援 data-first 與 data-last 的寫法,兩個範例如下:

  • data-first:
const data = {
name: 'cod',
age: '18',
}

const result = pick(data, ['name']);
  • data-last:
const data = {
name: 'cod',
age: '18',
}

const pickName = pick(['name']);
const result = pickName(data);

個人覺得使用上更為直覺。

此外 remeda 還有其他特性,詳細說明就不再此贅述,可以參考以下文檔。

Remeda

所以 pipe 有甚麼好處?

個人覺得最大的好處是不用一直想變數名稱 XD,而且 function 方便抽換,整體來說增加了程式的彈性。

讓我們看看以下例子。

假設我們有多個 IoT 設備回傳資料,網頁需要彙整並顯示內容,資料為:

interface Datum {
deviceId: string;
type: string;
temperature: number;
humidity: number;
otherSensorData: {
type: string;
value: number;
}[];
}

const data: Datum[] = [
{
deviceId: 'device_1',
type: 'A',
temperature: 24.5,
humidity: 50.0,
otherSensorData: [
{ type: 'A', value: 10 },
{ type: 'A', value: 20 }
]
},
{
deviceId: 'device_2',
type: 'B',
temperature: 22.3,
humidity: 45.5,
otherSensorData: [
{ type: 'B', value: 15 },
{ type: 'C', value: 25 }
]
}
]

以下讓我們來實際撰寫程式。

列出所有設備 ID 並用頓號分隔

熟悉 JS 的人一定可以很快寫出以下程式:

const result01 = data
.map(({ deviceId }) => deviceId)
.join('、');

用 pipe 寫則會像這樣:

const result02 = pipe(
data,
map(prop('deviceId')),
join('、')
);

看起來好像沒比較好捏?但是用 remeda 可以更簡單抽離與複用:

const getDeviceIdListString = createPipe(
map<Datum, string>(prop('deviceId')),
join('、')
);

也方便加入新的處理邏輯:

import { trim } from 'ramda';

const getDeviceIdListString = createPipe(
/** 將每個 deviceId 去除頭尾空白 */
map<Datum, string>(
createPipe(prop('deviceId'), trim),
),
join('、'),
);

邏輯越複雜效果會越明顯,來看看其他例子。

將設備依照 type 分類

const groupByType = pipe(
data,
groupBy(prop('type')),
values,
);

取得平均溫度與平均濕度

const meanData = {
temperature: pipe(data, meanBy(prop('temperature'))),
humidity: pipe(data, meanBy(prop('humidity'))),
};

取得 otherSensorData type 種類清單

const typeList = pipe(
data,
/** 將所有 otherSensorData 攤平、組成新矩陣 */
flatMap(prop("otherSensorData")),
/** 依照 type 數值去除重複項目 */
uniqBy(prop("type")),
/** 取出 type 數值產生新矩陣 */
map(prop("type"))
);

取得所有溫溼度不在舒適範圍內的設備

function isComfortableTemperature(value: number) {
return value >= 22 && value <= 28;
}
function isComfortableHumidity(value: number) {
return value >= 40 && value <= 60;
}

const isComfortable = createPipe(
allPass<Datum>([
createPipe(prop('temperature'), isComfortableTemperature),
createPipe(prop('humidity'), isComfortableHumidity),
])
)

const uncomfortableList = pipe(data, reject(isComfortable))

/**
* 因為只有一個參數,所以也可以用 data-first 的方式寫
* const result = reject(data, isComfortable);
*/

從以上例子來看,其實就算沒有註解,從 function 的名稱我們看得出來此程式在做甚麼。

這樣可讀性是不是提升了許多呢?( •̀ ω •́ )✧


如果錯誤或更好的做法,歡迎大家多多指教。(´▽`)



avatar-img
17會員
14內容數
各種鱈魚滾鍵盤的雜紀
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
因此最直觀來看,對於投資人來說的首要目標是獲取報酬(撇除自我實現),那麼回歸本質,價格成長的前提就是投資人對項目「未來的買單」,其本身的「獲利能力」、「用戶數」、「故事性」甚至「內線消息」等等則只是參考的要素之一,最後,變動的結果反應在該持有資產多久的「時間」身上。
好的關係營養是讓自己感覺愈來愈好,愈來愈成長⋯ 想到以前常常唸Y母,嘴巴要甜,要經常ㄜ樂媳婦丶要連和我說話都要想出媳婦的優點⋯這樣就不容易有婆媳問題,做人要活到老學到老⋯⋯ 結果我家Y母把這個嘴巴甜拿去要求她大女兒說話方式⋯還説是我說的😅 然後我呢~又中槍倒地了(丫姊很生氣) 以前也會唸丫母,當
Thumbnail
相信有好的專注力,才會有卓越的表現。 最近因為深深感受到「專注力」對我工作上的表現會差很多。 於是乎,特別為此潛心學習,甚至也做了筆記: 就會分成三個篇章來寫...... 分別為「睡眠習慣」、「飲食習慣」、「行為模式」三大類來寫,而究竟要如何改善才能有好的專注力呢?
Thumbnail
要如何為品牌設計一套獨特配色,使它既可以傳遞產品資訊,實現商業效益,同時又符合美學法則?這樣的色彩構成,需要協調多方面元素,如不同色彩間的關係與比例,以及對比、過渡、調和等色彩效果。 色彩對比是常用的手法,是把兩種或兩種以上的色彩並置所產生的對比現象。
大腿總是跟肚子一樣很容易累積厚嘟嘟的脂肪,也是很多人難以瘦下來的部位,很多人會選擇抽脂,不過雙腳是每日生活的必備品,所以會擔心大腿抽脂後悔的問題,不過腦波有點弱的我,也收集到不少成功戰勝的心得。所以決定進一步找尋相關資訊。 那麼大腿抽脂會怎麼樣進行呢? 它是以一個360度圓去進行抽脂,範圍包括大腿到
Thumbnail
最近某咖啡業者,以羅布斯塔豆子冒充阿拉比卡豆被媒體踢爆之後,商譽大打折扣,不過大家可知道,就算阿拉比卡豆也不代表就是精品咖啡呢! 好產區的咖啡豆如果沒有經過挑豆這道把關,不用夾到手指一樣可以讓你進急診室。
Thumbnail
上篇解析到找工作先檢視公司體質,第二篇緊接著進入細部的「工作條件」;很多新鮮人,一開始想找工作,不外乎是透過人力銀行的網站上尋找職缺,不過有些人會單純只看見「職缺名稱」就一頭熱投出履歷,或者是「幻想」
Thumbnail
這本書在我的感覺裡,算是一本描述現代現象的一本書,涵蓋了好多除了愛情以外的許多因社會硬體的進步而產生都市現象,寫得非常精確且入骨,入到有點刺痛的感覺。(所以本書可能不適合每個人,心臟強一點的人看比較
Thumbnail
<p>常常聽到別人說:「祝你今晚作個好夢喔!」</p> <p>但好夢,真的好嗎?</p>
Thumbnail
沙其瑪的由來 『沙其瑪,Sachima』又名“薩其馬”,在香港也稱之為『瑪仔』,源於滿洲,是清代關外三陵祭祀的祭品之一,由滿族人引入北京後風行全中國。據《光緒順天府志》記載「賽利馬為喇嘛點心,今市肆為之,用面雜以果品,和糖及豬油蒸成,味極美。」就是指沙其瑪。而歷史裡首次正式提及沙其瑪...
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
因此最直觀來看,對於投資人來說的首要目標是獲取報酬(撇除自我實現),那麼回歸本質,價格成長的前提就是投資人對項目「未來的買單」,其本身的「獲利能力」、「用戶數」、「故事性」甚至「內線消息」等等則只是參考的要素之一,最後,變動的結果反應在該持有資產多久的「時間」身上。
好的關係營養是讓自己感覺愈來愈好,愈來愈成長⋯ 想到以前常常唸Y母,嘴巴要甜,要經常ㄜ樂媳婦丶要連和我說話都要想出媳婦的優點⋯這樣就不容易有婆媳問題,做人要活到老學到老⋯⋯ 結果我家Y母把這個嘴巴甜拿去要求她大女兒說話方式⋯還説是我說的😅 然後我呢~又中槍倒地了(丫姊很生氣) 以前也會唸丫母,當
Thumbnail
相信有好的專注力,才會有卓越的表現。 最近因為深深感受到「專注力」對我工作上的表現會差很多。 於是乎,特別為此潛心學習,甚至也做了筆記: 就會分成三個篇章來寫...... 分別為「睡眠習慣」、「飲食習慣」、「行為模式」三大類來寫,而究竟要如何改善才能有好的專注力呢?
Thumbnail
要如何為品牌設計一套獨特配色,使它既可以傳遞產品資訊,實現商業效益,同時又符合美學法則?這樣的色彩構成,需要協調多方面元素,如不同色彩間的關係與比例,以及對比、過渡、調和等色彩效果。 色彩對比是常用的手法,是把兩種或兩種以上的色彩並置所產生的對比現象。
大腿總是跟肚子一樣很容易累積厚嘟嘟的脂肪,也是很多人難以瘦下來的部位,很多人會選擇抽脂,不過雙腳是每日生活的必備品,所以會擔心大腿抽脂後悔的問題,不過腦波有點弱的我,也收集到不少成功戰勝的心得。所以決定進一步找尋相關資訊。 那麼大腿抽脂會怎麼樣進行呢? 它是以一個360度圓去進行抽脂,範圍包括大腿到
Thumbnail
最近某咖啡業者,以羅布斯塔豆子冒充阿拉比卡豆被媒體踢爆之後,商譽大打折扣,不過大家可知道,就算阿拉比卡豆也不代表就是精品咖啡呢! 好產區的咖啡豆如果沒有經過挑豆這道把關,不用夾到手指一樣可以讓你進急診室。
Thumbnail
上篇解析到找工作先檢視公司體質,第二篇緊接著進入細部的「工作條件」;很多新鮮人,一開始想找工作,不外乎是透過人力銀行的網站上尋找職缺,不過有些人會單純只看見「職缺名稱」就一頭熱投出履歷,或者是「幻想」
Thumbnail
這本書在我的感覺裡,算是一本描述現代現象的一本書,涵蓋了好多除了愛情以外的許多因社會硬體的進步而產生都市現象,寫得非常精確且入骨,入到有點刺痛的感覺。(所以本書可能不適合每個人,心臟強一點的人看比較
Thumbnail
<p>常常聽到別人說:「祝你今晚作個好夢喔!」</p> <p>但好夢,真的好嗎?</p>
Thumbnail
沙其瑪的由來 『沙其瑪,Sachima』又名“薩其馬”,在香港也稱之為『瑪仔』,源於滿洲,是清代關外三陵祭祀的祭品之一,由滿族人引入北京後風行全中國。據《光緒順天府志》記載「賽利馬為喇嘛點心,今市肆為之,用面雜以果品,和糖及豬油蒸成,味極美。」就是指沙其瑪。而歷史裡首次正式提及沙其瑪...