Dart 的 extension、mixin、Utility Class 的同異處

法蘭克的 iOS 世界
3 min readJul 26, 2023

--

這三種方式都可以幫助我們在開發時,用來分類歸納擴展出共用的 functions,藉此提高程式碼的可讀性、可維護性、可擴展性,不過,該如何根據應用場景挑選出合適的方式呢?我希望看完這篇文章後,會讓你更有想法。今天就來說明它們是什麼?用法?生命週期?最後再說明各自的應用場景為何?

extension

extension <extension name> on <type> {
(<member definition>)
}
  • 利用 extension 關鍵字為現有的 class 擴展方法
  • 可直接透過相對應的 class 使用其擴展的方法,就像該 function 是該 class 的成員一樣
extension

mixin

mixin <type> {
(<member definition>)
}
  • mixin 是 dart 提供一種可將共用的 function 混入到其它 class 中的一種方式
  • 利用 mixin 關鍵字來定義
  • 使用 with 關鍵字混入到要使用的 class 中
  • 可 with 1~n 個 mixin,並透過,隔開
mixin

Utility class

  • 成員通常為 static 的,function 可直接透過 class 使用
  • 共用的 static 成員都會封裝在一個獨立的 Util class 中
  • 通常會將相同類型的共用的 function 組織在同屬性的 class 中
Utility class

生命週期

extension

Dart 的 extension 是 static 的。所以,當應用程式啟動時,static 成員就會被初始化,並且在程式執行期間,它們會一直存在於記憶體中。

mixin

它有 OOP 組合(Composition)的特性,其生命週期在其被使用的 class 中有效。當一個 class 使用了某個 mixin,該 mixin 的功能就會被混入到該類別中,並且在該 class 的整個生命週期中都有效。

Utility class

因其成員都是 static ,故與 extension 的生命週期相同。

應用場景

單一 class 擴充多個 classes 整合多個 classes 重用的角度去評估該用什麼方式來達到共用的目的。

extension

當需要對現有 class 增加通用的方法或功能時。例如,可以為 String 類別增加一個用於驗證 email 的方法。

mixin

當有一些功能需要在多個 classes 中共享並重用時,可以使用 Mixin。例如,可以創建一個用於實現日誌記錄功能的 mixin,然後將它混入到多個需要記錄日誌的 class 中。

Utility class

當你有一些功能性相同的 functions,且不依賴於特定的類別。例如,將 String 和 DateTime 與日期相關的 fucntions 都重新封裝在 DateUtil class。

結論

extension 主要用於為現有的 class 增加功能,mixin 主要用於在多個 classes 中重用功能,而 Utility Class 則主要用於建立一些共用的 static 方法。在選擇使用哪種機制時,需要根據具體的需求和場景來進行選擇。

如果您喜歡我的文章,請多按幾下「拍手」給我鼓勵,或是按「follow」讓我持續提供好文章給您。若有任何問題也歡迎隨時提出。

--

--