This is the first time I'm writing a library (for me to use on several games) so I think for good programming practice I should comment my code throughly, adding XML summary and use exception handling when user of this library done something wrong like in many .NET classes (the user will likely be me or my teammates)
This is the constructor for NoteRow class (I'm developing music games, by the way) which needs to determine the array's size on creation
bool[] l1NoteData;
public NoteRow(int numberOfNotes)
{
this.l1NoteData = new bool[numberOfNotes];
}
Now I have this method to toggle the booleans on l1NoteData array.
public void toggleNote(uint index)
{
l1NoteData[index] = !l1NoteData[index]
}
So here as defensive programming I'd like to check that the index (that user of this class will specify, which is me or maybe my teammates) is out of range specified when creating this class or not.
I've read MANY throw exception vs. assert vs. return bool etc. and still confused and can't choose. Here is my concern :
- Should I putting 'if' statement to check if index is exceeding l1NoteData.length then fire an exception when it is, knowing that exception will fire anyway when that line executed with 'out of range' index? (IndexOutOfRangeException) If so then what is the use of throwing exception? If something goes wrong there will be a default exception anyway?
- I've read that Assert is for programmer. To notice the programmer that the code is not working as the programmer assume. And one can never inject a test case to make the assert fire (if it is fired then the code is wrong) compared to throwing exception which is there to handle abnormal test case (by user). Now the user of this library will be me. So I'm considered a programmer or user? I, as a user of this class may call
toggleNote
and input index exceeding the limit of array so the exception will be thrown. Or I,as a programmer of my games (this library is the part of my game) should put assert there so I'm not make a mistake of callingtoggleNote
with over-the-limit index from my game. (that use this library) I can now know the game's code is wrong because assert is fired then fix it and finally made into release build. (and then the assert code will be gone) - From question above, if I test thoroughly that I'm sure there is no more bug that cause assert to run then go in to release build. I know that assert will not in the code in release build... but is that really good? There are probably more bugs remain in the program so now when user experience that bug, the assert isn't there to catch the bug anymore. So is assert really good thing to use when I can use exception instead and if user cause that exception to fire, I as a developer can receive that bug report to fix it etc. (but the user is me and my friends)
- Throwing exception is 100% better than returning bool to indicate success/failure? What example can you think that is more appropriate to returning bool?
Sorry for my confusing English because I'm already confused with this problem...