Weird title, no? I couldn’t think of a snappier one, I’m afraid.
I’ve been thinking of a way to ensure that this sort of subtle bug/typo doesn’t happen:
public void MyMethod(int useCaseId)
{
// Do something with the useCaseId
}
public void SomeOtherMethod()
{
int userId = 12;
int useCaseId = 15;
MyMethod(userId); // Ooops! Used the wrong value!
}
This bug would be hard to find because there’s no compile-time error, and you wouldn’t necessarily even get an exception at run-time. You’d just get “unexpected results”.
To resolve this in a simple way, I’ve experimented with using empty enum definitions. Effectively making a user id a datatype (without going quite as far as a class or a struct):
public enum UseCaseId { // Empty... }
public enum UserId { // Empty... }
public void MyMethod(UseCaseId useCaseId)
{
// Do something with the useCaseId
}
public void SomeOtherMethod()
{
UserId userId = (UserId)12;
UseCaseId useCaseId = (UseCaseId)15;
MyMethod(userId); // Compile error!!
}
What d’you think?
I’d go a little further and create the class, since the amount of work required would be paid back through not having to type cast the int.
Comment by Mark — October 23, 2009 @ 1:21 pm