我正在设计一个执行以下操作的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 用户)不会对这种行为感到惊讶。
而且,正如您所指出的那样,预先准备好先决条件更加容易理解。
所以对我来说第二种方法。