返回介绍

1.3 保镖模式

发布于 2025-01-04 00:44:54 字数 2105 浏览 0 评论 0 收藏 0

保镖模式 (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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文