[TOC]
在Dart中,可選參數可以是位置參數,也可以是命名參數,但不能同時參考。
## 避免位置布爾參數。
與其他類型不同,布爾值通常以文字形式使用。像數字這樣的東西通常被包裝在命名的常量中,但是我們通常直接傳遞真和假。如果不清楚布爾值表示什么,就會導致callsites無法讀取:
~~~
【bad】
new Task(true);
new Task(false);
new ListBox(false, true, true);
new Button(false);
~~~
相反,考慮使用命名參數、命名構造函數或命名常量來闡明調用的作用。
~~~
Task.oneShot();
Task.repeating();
ListBox(scroll: true, showScrollbars: true);
Button(ButtonState.enabled);
~~~
注意,這并不適用于setter,在setter中名稱清楚地表示值的含義:
~~~
listBox.canScroll = true;
button.isEnabled = false;
~~~
## 如果用戶可能想要省略早期的參數,則避免可選的位置參數。
可選的位置參數應該具有邏輯級別,使得前面的參數比后面的參數更頻繁地被傳遞。 用戶幾乎不需要顯式傳遞“占位”來省略先前的位置參數以便后邊參數的傳遞。 最好還是使用命名參數。
~~~
String.fromCharCodes(Iterable<int> charCodes, [int start = 0, int end]);
DateTime(int year,
[int month = 1,
int day = 1,
int hour = 0,
int minute = 0,
int second = 0,
int millisecond = 0,
int microsecond = 0]);
Duration(
{int days = 0,
int hours = 0,
int minutes = 0,
int seconds = 0,
int milliseconds = 0,
int microseconds = 0});
~~~
## 避免強制參數接受一個特殊的“無參數”值。
如果用戶在邏輯上漏掉了一個參數,那么寧愿讓他們通過使參數可選而實際上忽略它,而不是強迫他們傳遞null、空字符串或其他表示“未傳遞”的特殊值。
省略參數更簡潔,有助于防止錯誤,當用戶認為標記值(如null)提供了真正的值時,意外地傳遞了該值。
~~~
var rest = string.substring(start);
~~~
~~~
【bad】
var rest = string.substring(start, null);
~~~
## 請使用包含開始和獨占結束參數來接受范圍。
如果您正在定義一個方法或函數,該方法或函數允許用戶從整數索引序列中選擇元素或項的范圍,那么可以使用start索引,它指的是第一個項和一個(可能是可選的)比最后一個項的索引大一個的結束索引。
這與做同樣事情的核心庫是一致的。
~~~
[0, 1, 2, 3].sublist(1, 3) // [1, 2]
'abcd'.substring(1, 3) // 'bc'
~~~
在這里保持一致特別重要,因為這些參數通常是未命名的。如果您的API使用的是長度而不是端點,那么在callsite上根本就看不到差異。