我正在设计一个执行以下操作的API:

// Drop $howMany items from after $from
def dropElements[T](array: Array[T], from: Int, howMany: Int)

预期的行为是howMany应该为非负数,如果howMany为零,则不应进行任何修改。我有两种方法可以实现此目的:
def dropElements[T](array: Array[T], from: Int, howMany: Int) {
  assert(howMany >= 0);
  if (howMany == 0) return;
  assert(0 <= from && from < array.length);
  ....
}

或者:
def dropElements[T](array: Array[T], from: Int, howMany: Int) {
  assert(howMany >= 0);
  assert(0 <= from && from < array.length);
  if (howMany == 0) return;
  ....
}

与第一种方法相比,我赞成第二种方法(预先声明您的前提条件),但有人指出,当howMany = 0时,第一种方法更符合要求。

有什么想法或优点/缺点吗?我要求作为designer of a standard collections library

最佳答案

我的想法,值得:

我认为在所有情况下对from进行绑定(bind)检查都更加一致。无论from的值如何,超出范围的howMany都可能是调用者代码中的错误。对我而言,在这种情况下最好快速失败。

我并不认为这违反要求。至少,我(作为您的api的 future 用户)不会对这种行为感到惊讶。

而且,正如您所指出的那样,预先准备好先决条件更加容易理解。

所以对我来说第二种方法。

09-30 21:27