这是我第一次编写一个库(供我在几个游戏中使用),所以我认为为了良好的编程习惯,我应该彻底注释我的代码,添加 XML 摘要并在这个库的用户做错事时使用异常处理,比如在许多 .NET 类中(用户可能是我或我的队友)
这是 NoteRow 类的构造函数(顺便说一句,我正在开发音乐游戏),它需要在创建时确定数组的大小
bool[] l1NoteData;
public NoteRow(int numberOfNotes)
{
this.l1NoteData = new bool[numberOfNotes];
}
现在我有这个方法来切换 l1NoteData 数组上的布尔值。
public void toggleNote(uint index)
{
l1NoteData[index] = !l1NoteData[index]
}
因此,作为防御性编程,我想检查索引(该类的用户将指定,即我或我的队友)是否超出了创建此类时指定的范围。
我已经阅读了许多 throw exception vs. assert vs. return bool 等,但仍然感到困惑并且无法选择。这是我的担忧:
- 我是否应该使用“if”语句来检查索引是否超过 l1NoteData.length,然后在出现异常时触发异常,知道当使用“超出范围”索引执行该行时异常会触发?(IndexOutOfRangeException) 如果是这样,那么抛出异常有什么用?如果出现问题,无论如何都会有默认异常?
- 我读过 Assert 是为程序员准备的。通知程序员代码不像程序员假设的那样工作。与抛出异常(由用户处理异常测试用例)相比,人们永远无法注入测试用例来使断言触发(如果它被触发则代码错误)。现在这个图书馆的用户将是我。所以我被认为是程序员或用户?我,作为这个类的用户,可能会调用
toggleNote
并输入超出数组限制的索引,所以会抛出异常。或者我,作为我的游戏的程序员(这个库是我游戏的一部分)应该把 assert 放在那里,所以我不会犯错误调用toggleNote
我的游戏中的超限指数。(使用这个库)我现在可以知道游戏的代码是错误的,因为 assert 被触发然后修复它并最终进入发布版本。(然后断言代码将消失) - 从上面的问题来看,如果我彻底测试,我确定没有更多的错误导致断言运行,然后进入发布版本。我知道断言不会在发布版本的代码中......但这真的很好吗?程序中可能还存在更多错误,因此现在当用户遇到该错误时,断言不再用于捕获错误。所以当我可以使用异常并且如果用户导致该异常触发时,断言真的是一件好事,我作为开发人员可以收到该错误报告来修复它等等(但用户是我和我的朋友)
- 抛出异常比返回 bool 指示成功/失败要好 100%?您认为哪个示例更适合返回 bool?
对不起,我的英语令人困惑,因为我已经对这个问题感到困惑......