Guard Clauses
Ardalis द्वारा उत्कृष्ट C# Guard Clauses 包的 Dart 移植版。
一个简单且可扩展的带有 guard clause 扩展的包。
一个 guard clause 是一个软件模式,通过“快速失败”,提前检查无效输入并在发现任何无效输入时立即失败,从而简化复杂函数。
用法
void processOrder(Order? order)
{
Guard.against.nullValue(order, 'order');
// process order here
}
// OR
class Order
{
String _name;
int _quantity;
double _max;
double _unitPrice;
Order(String name, int quantity, double max, double unitPrice) {
_name = Guard.against.nullOrWhiteSpace(name);
_quantity = Guard.against.negativeOrZero(quantity);
_max = Guard.against.zero(max);
_unitPrice = Guard.against.negative(unitPrice);
}
}
支持的 Guard Clauses
- Guard.against.invalidInput (如果谓词表达式返回 false,则抛出异常)
- Guard.against.invalidFormat (如果输入字符串不匹配提供的正则表达式,则抛出异常)
- Guard.against.negative (如果输入为负数,则抛出异常)
- Guard.against.negativeOrZero (如果输入为负数或零,则抛出异常)
- Guard.against.nullValue (如果输入为 null,则抛出异常)
- Guard.against.nullOrEmpty (如果输入字符串为 null 或空,则抛出异常)
- Guard.against.nullOrEmptyCollection (如果输入集合为 null 或空,则抛出异常)
- Guard.against.nullOrWhiteSpace (如果输入字符串为 null、空或空白字符,则抛出异常)
- Guard.against.nullOrInvalidInput (如果输入为 null,或谓词表达式返回 false,则抛出异常)
- Guard.against.indexOutOfRange (如果输入不是有效索引,则抛出异常)
- Guard.against.outOfRangeItems (如果输入集合中的任何值超出了提供的范围,则抛出异常)
- Guard.against.outOfRange (如果输入集合超出了提供的范围,则抛出异常)
- Guard.against.zero (如果数字输入为零,则抛出异常)
用自己的 Guard Clauses 进行扩展
要通过创建自己的 guard clauses 来扩展,请为 Guard 创建一个新的扩展类。
extension GuardExtensions on Guard {
/// Throws an ArgumentError if [input] is 'foo'.
/// Returns [input] otherwise.
String foo(String input, {String? name}) {
if (input.toLowerCase()) {
throw ArgumentError.value(input, name);
}
return input;
}
}
// Usage
void sumpin(String otherSumpin) {
Guard.against.foo(otherSumpin);
...
}
参考
这些引用以 C# 为中心,但概念适用性很强。
- Guard Clauses 入门
- 如何在 .NET 中编写清晰的验证子句 (Nick Chapsas, YouTube, 9 分钟)
- Guard Clauses (播客:7 分钟)
- Guard Clause