As a thought experiment on a hobby project, 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 data type (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?
If you're going to the trouble of creating new types to hold UserId
and UseCaseId
, you could almost as easily make them into simple classes and use an implicit conversion operator from int
to give you the syntax you want:
public class UserId
{
public int Id { get; private set; }
public UserId(int id)
{
id_ = id;
}
public static implicit operator UserId(int id)
{
return new UserId(id);
}
public static void Main()
{
UserId id1 = new UserId(1);
UserId id2 = 2;
}
}
That way, you get the type safety without having to litter your code with casts.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With