網站首頁 編程語言 正文
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
- 上一篇:iOS msgSend消息發送流程
- 下一篇:html頁面 加載完成后再刷新 一次
相關推薦
- 2022-10-27 QT線程QThread的使用介紹_C 語言
- 2022-03-29 詳解python字符串相關str_python
- 2022-04-02 Python面向對象的程序設計詳情_python
- 2022-03-30 Android實現屏幕保持常亮功能_Android
- 2022-06-12 Python利用subplots_adjust方法解決圖表與畫布的間距問題_python
- 2023-11-17 Python 如何獲取線程的返回值
- 2022-10-11 C++函數對象Functor與匿名函數對象Lambda表達式詳解_C 語言
- 2022-04-19 C語言進階可變參數列表_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支