日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

在 Dart 中更好地使用類和 Mixin

作者:島上碼農 更新時間: 2022-05-13 編程語言

Dart 是一門“純”面向對象的編程語言,其中所有的對象都是類的實例。但是 Dart 并不要求所有代碼都定義在一個類中。我們可以在一個類的外面定義頂級變量、常量、函數 —— 就像面向過程語言那樣。正式因為這樣,Dart 的編碼會有些特殊的建議。

建議1:如果一個抽象類只有一個函數,那么直接定義函數會更好

假設我們需要一個回調函數或使用一個函數,在像 Java 那樣的語言中你需要定義一個類。但是,在 Dart 中,如果僅僅是一個函數,定義類反而使得代碼不好維護。這個時候建議直接使用 typedef 來定義函數別名。

// 正確示例
typedef Predicate = bool Function(E element);

// 錯誤示例
abstract class Predicate {
  bool test(E element);
}

建議2:如果一個類只有靜態變量或函數的話,那么直接定義頂級的常量和函數來替換這種方式

Java 或 C#中,如果要定義常量的話通常需要定義一個靜態常量類來做,例如:

// Java 代碼
public class ConstParams {
    public static int maxLength = 256;
    public static int minLength = 5;
}

這樣做的好處是假設靜態常量名在多個類中定義的話,可以通過命名空間避免沖突。那么對于 Dart 而言,在類外面定義的變量、函數可以使用庫(library)作為命名空間來區分,因此這樣的話即便出現變量名一致也不會沖突。

// const_params.dart
const int maxLength = 256;
const int minLength = 5;

// test.dart
import 'const_params.dart' as ConstParams;

void main() {
   print('max: ${ConstParams.maxLength}');
}

因此在 Dart中,下面的寫法是不推薦的。

class ConstParams {
  static const maxLength = 256;
  static const minLength = 256;
}

當然,這并不是一個硬性規定,比如如果有一組相同類的常量的話,那么使用類會使得代碼的可讀性更高,例如下面顏色這個例子。

class Color {
  static const red = '#f00';
  static const green = '#0f0';
  static const blue = '#00f';
  static const black = '#000';
  static const white = '#fff';
}

建議3:不要輕易使用繼承

這個在很多語言都有介紹過,繼承應該僅在子類符合“is a”父類的關系的時候才使用。比如 Dog 類可以繼承 Animal 類,但是這個也應該限于父類足夠抽象,沒有太多個性化特征,而且未來的改動也極少。

使用繼承確實可以減少編碼,但是基類的任何變動都可能導致你的子類代碼異常。如果你的子類很多的話,那么維護起來是相當恐怖的。一個比較好的建議是,對于支持繼承的基類統一命名表名該類可以繼承,比如 IterableBase。同時,對于基類一定寫好文檔,方便想繼承該類的子類清楚知道可能的影響。

建議4:不要使用 implements 實現非接口類

接口類的定義的好處是可以在多種實現方式中切換而無需更改代碼,在依賴注入型的框架或代碼結構中會經常使用面向接口編程的方式。

如果一個類的設計目的不是用作接口的,那么使用 implements 來實現這個類的方法的話是很奇怪的行為。往這個類中加入成員變量不會產生什么問題,但是如果新增方法的話就會意味著代碼會出錯。因此,如果要采取面向接口編程,定義的接口類應該是一個“虛”類,只有必要方法聲明,而沒有其他屬性。同時,這個類應該有良好的文檔注釋,以便實現類能夠知道如何準確地實現對應的接口。

建議5:優先使用 mixin 關鍵字定義 mixin 類型

在 Dart 2.1.0版本以前,并沒有關鍵字 mixin,需要混入其他特性的話,需要使用 class 定義混入類型。而在 Dart 2.1.0版本后,引入了 mixin 專門定義混入類型,這樣使得語義更加清晰,可以對比一下下面的兩種實現方式。很顯然,使用 mixin 會讓我們更清晰地知道這是一個混入類型,而不會當做一個類來使用。官方的建議是,自 Dart 2.1.0版本以后,不應該再使用 class 關鍵字定義混入類型,以避免出現隨意混入,導致代碼不好維護。

// mixin 方式
mixin SpeakEnglishMixin {
  void speakEnglish() {
    print('I can speak English fluently');
  }
}

// class 方式
class SpeakEnglishMixin {
  void speakEnglish() {
    print('I can speak English fluently');
  }
}

此外,mixin 也可以使用 on 關鍵字指定只適用于特定的類,從而限定范圍,避免濫用。 下面聲明的這個例子中 SpeakEnglishMixin 只能用于 Person 子類混入。

mixin SpeakEnglishMixin on Person {
  void speakEnglish() {
    print('I can speak English fluently');
  }
}

總結

本篇介紹了 Dart 相比其他面向對象語言的一些獨有特性,例如類外面的變量、函數定義,mixin 等。其實 Dart 可以說是綜合了面向對象語言和動態語言的優點,更貼近現代化編程語言的特性。但編碼工作萬變不離其宗,我們利用 Dart 的特性應該是為了編寫更好維護的代碼,而不是濫用誤用其新特性。

原文鏈接:https://blog.csdn.net/shuijian00/article/details/124694776

欄目分類
最近更新