有顏色的函式不是壞事

更新於 發佈於 閱讀時間約 2 分鐘

What Color is Your Function? 一文中

Async function 被比喻成「紅色函式」

紅色函式不能在普通的函式裡(即「藍色函式」)使用

因此紅色具有感染性

定義函式之前必須先決定是否要染成紅色

作者不喜歡這種麻煩的規則

但我認為這種麻煩是有道理的


並不是只有Async function具有這種特性

其他像是:

Java的throw catch語法

rust的unsafe function

PureScript的partial function

Haskell的IO Monad

c++的non-const function

它們都具有感染性

它們的顏色代表了它們所關注的特性

Java強化傳統的例外處理機制

使錯誤變得可預期

rust在意記憶體安全

並使用unsafe在語法上明確地說明這一點

Haskell對於pure(referential transparency)的要求很嚴格

side effect必須以Monad的形式標註於型別上

Haskell因為歷史因素在totality上有很大的問題

而PureScript用Partial class修復了這個的問題

c++的non-const function只能在non-const function裡和non-const variable呼叫

使得const保證物件不會被修改


感染性使問題得以從根源(callee)傳播到你面前(caller)

這些都是在編譯時期完成的

因此開發者得以解放部分的專注力

把精力與時間花在真正的程式邏輯上

感染性使得這個特性使用起來會比較麻煩

這是因為他把原本被忽略被隱藏的特性顯現出來

rust的unsafe揭示了原本在c++習以為常但危險的操作

PureScript的partial也是如此

它們同時也建議使用者盡量把紅色函式抽離出來

而不是全部攪和在一起

rust本身的設計就是希望安全的程式碼應該好寫

不安全的程式碼仍然可能但不容易寫

Haskell的IO雖然是因為純函數式設計的問題才出現的

但同時也提供了「分離輸入輸出與計算邏輯」的思考方式


總結來說感染性使用的好是會給開發者帶來好處的

但像是c++的const就是使用的很差的例子

具有感染性的其實是non-const

但開發者常常在宣告函式時沒有正確的使用const

這使得const用起來很不方便

常常需要手動const_cast

相較之下rust的mut就非常地完美

更糟的例子是當有兩套一樣的函式但有兩種顏色時

我們就必須選邊站

Async function就是這種情況

另外類似的還有OOP的encapsulation

OOP把封裝限定在資料型別上

要使用封裝的函式只能繼承自該類別

這使得「少用繼承多用組合」變得難以實現

物件導向因此變得具有感染性(在壞的意義上)

留言
avatar-img
留言分享你的想法!
avatar-img
have bear的沙龍
4會員
28內容數
這不是教你如何從物件導向到函數式編程的入門教程。我會深入探討物件導向與函數式編程的差異,並討論為什麼你應該使用函數式編程並徹底放棄物件導向。
你可能也想看
Thumbnail
本章節為Swift程式語言的異常處理介紹,說明了為何需要進行異常處理以及如何進行異常處理。提供了使用do、try、catch和throw關鍵字進行異常處理的基本語法並展示了其在實際程式中的應用。同時也說明了Swift中的一些常見異常類型,並且教導了如何主動觸發異常訊息和定義自己的異常類型。
Thumbnail
本章節為Swift程式語言的異常處理介紹,說明了為何需要進行異常處理以及如何進行異常處理。提供了使用do、try、catch和throw關鍵字進行異常處理的基本語法並展示了其在實際程式中的應用。同時也說明了Swift中的一些常見異常類型,並且教導了如何主動觸發異常訊息和定義自己的異常類型。
Thumbnail
本章節的目的是介紹在TypeScript中如何進行例外處理。涵蓋了例外處理的重要性、語法、常見異常類型以及如何主動觸發異常訊息及用戶自定義異常訊息。為讀者提供了全面而深入的了解,以提高程式的可靠性、提供更好的反饋、增加程式的容錯性以及改善程式的可讀性。
Thumbnail
本章節的目的是介紹在TypeScript中如何進行例外處理。涵蓋了例外處理的重要性、語法、常見異常類型以及如何主動觸發異常訊息及用戶自定義異常訊息。為讀者提供了全面而深入的了解,以提高程式的可靠性、提供更好的反饋、增加程式的容錯性以及改善程式的可讀性。
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
先須知識: 了解什麼是變數 作用域scope 在Rust中,變數預設是不可變的 let name = "Zoe"; // 預設變數不可變 也就同於Javascript中的const,若想讓變數可變則需要在let後面加上mut關鍵字: let mut name = "Vicky"; nam
Thumbnail
先須知識: 了解什麼是變數 作用域scope 在Rust中,變數預設是不可變的 let name = "Zoe"; // 預設變數不可變 也就同於Javascript中的const,若想讓變數可變則需要在let後面加上mut關鍵字: let mut name = "Vicky"; nam
Thumbnail
我個人是盡可能不寫 switch statement,但觀察這幾年程式語言的趨勢,會發現許多語言把 switch statement 擴充成為實作 pattern matching 的工具,說不定以後 switch statement 會越來越廣泛使用也說不定。
Thumbnail
我個人是盡可能不寫 switch statement,但觀察這幾年程式語言的趨勢,會發現許多語言把 switch statement 擴充成為實作 pattern matching 的工具,說不定以後 switch statement 會越來越廣泛使用也說不定。
Thumbnail
在軟體開發中,處理nil或空值是一個常見的挑戰。不妥當地處理它們可能導致錯誤,使得程式碼的健壯性下降。但有沒有一種方法,可以讓我們在不做特殊檢查的情況下,優雅地處理這些空值呢?答案是肯定的,那就是空物件模式 (Null Object Pattern)!
Thumbnail
在軟體開發中,處理nil或空值是一個常見的挑戰。不妥當地處理它們可能導致錯誤,使得程式碼的健壯性下降。但有沒有一種方法,可以讓我們在不做特殊檢查的情況下,優雅地處理這些空值呢?答案是肯定的,那就是空物件模式 (Null Object Pattern)!
Thumbnail
大家有沒有遇到過這種情況:當應用程式使用過多資源,如記憶體或 CPU 時,整個系統的性能直線下降?😰 不得不說,資源的有效管理在軟體開發中真的超級重要!這就是享元模式 (Flyweight Pattern) 大顯身手的時候了!
Thumbnail
大家有沒有遇到過這種情況:當應用程式使用過多資源,如記憶體或 CPU 時,整個系統的性能直線下降?😰 不得不說,資源的有效管理在軟體開發中真的超級重要!這就是享元模式 (Flyweight Pattern) 大顯身手的時候了!
Thumbnail
這篇文章將會分享 Clean Code 關於函式的重點,內容主要以個人閱讀後有印象的部分著手,有興趣了解更多請自行購買這本書。
Thumbnail
這篇文章將會分享 Clean Code 關於函式的重點,內容主要以個人閱讀後有印象的部分著手,有興趣了解更多請自行購買這本書。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News