文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1.3 保镖模式
保镖模式 (Bouncer Pattern)指的是某个方法唯一目的在于抛出异常(当满足特定条件时)或什么都不做。这种方法经常使用于防卫警戒某方法的前提条件。
当编写工具方法时,应对有可能会出毛病的输入参数保持警惕。在编写内部方法时,应该通过有效的单元测试来保证一直持有特定前提条件。因为在这些情况下,人们可能不会注重方法的防御。
在这一点上,Groovy 区别于其他语言的地方就在于,经常在方法中使用 assert
方法,而不是大量的工具检查器方法或类。
1.3.1 Null 检查范例
假如工具方法如下所示:
class NullChecker {
static check(name, arg) {
if (arg == null) {
throw new IllegalArgumentException(name + ' is null')
}
}
}
它的用法可能如下:
void doStuff(String name, Object value) {
NullChecker.check('name', name)
NullChecker.check('value', value)
// 事务逻辑
}
但用 Groovy 来做,就简单多了:
void doStuff(String name, Object value) {
assert name != null, 'name should not be null'
assert value != null, 'value should not be null'
// 事务逻辑
}
1.3.2 验证范例
作为一种替代性范例,可能会有下面这样的工具方法:
class NumberChecker {
static final String NUMBER_PATTERN = "\\\\d+(\\\\.\\\\d+(E-?\\\\d+)?)?"
static isNumber(str) {
if (!str ==~ NUMBER_PATTERN) {
throw new IllegalArgumentException("Argument '$str' must be a number")
}
}
static isNotZero(number) {
if (number == 0) {
throw new IllegalArgumentException('Argument must not be 0')
}
}
}
并像下面这样使用它:
def stringDivide(String dividendStr, String divisorStr) {
NumberChecker.isNumber(dividendStr)
NumberChecker.isNumber(divisorStr)
def dividend = dividendStr.toDouble()
def divisor = divisorStr.toDouble()
NumberChecker.isNotZero(divisor)
dividend / divisor
}
println stringDivide('1.2E2', '3.0')
// => 40.0
但利用 Groovy,我们只需这样使用即可:
def stringDivide(String dividendStr, String divisorStr) {
assert dividendStr =~ NumberChecker.NUMBER_PATTERN
assert divisorStr =~ NumberChecker.NUMBER_PATTERN
def dividend = dividendStr.toDouble()
def divisor = divisorStr.toDouble()
assert divisor != 0, 'Divisor must not be 0'
dividend / divisor
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论