Dart 的 extension、mixin、Utility Class 的同異處
這三種方式都可以幫助我們在開發時,用來分類
、歸納
和擴展
出共用的 functions,藉此提高程式碼的可讀性、可維護性、可擴展性,不過,該如何根據應用場景挑選出合適的方式呢?我希望看完這篇文章後,會讓你更有想法。今天就來說明它們是什麼?用法?生命週期?最後再說明各自的應用場景為何?
extension
extension <extension name> on <type> {
(<member definition>)
}
- 利用 extension 關鍵字為現有的 class 擴展方法
- 可直接透過相對應的 class 使用其擴展的方法,就像該 function 是該 class 的成員一樣
mixin
mixin <type> {
(<member definition>)
}
- mixin 是 dart 提供一種可將共用的 function 混入到其它 class 中的一種方式
- 利用 mixin 關鍵字來定義
- 使用 with 關鍵字混入到要使用的 class 中
- 可 with
1~n 個
mixin,並透過,
隔開
Utility class
- 成員通常為 static 的,function 可直接透過 class 使用
- 共用的 static 成員都會封裝在一個獨立的 Util class 中
- 通常會將相同類型的共用的 function 組織在同屬性的 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」讓我持續提供好文章給您。若有任何問題也歡迎隨時提出。