Как мысленный эксперимент над проектом хобби, я думал так, чтобы гарантировать, что такого рода тонкие ошибки/опечатки не бывает:Сильно типизированных целые
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!
}
Эта ошибка будет трудно найти, потому что ошибки компиляции не существует, и вы не обязательно получите исключение во время выполнения. Вы просто получите «неожиданные результаты».
Чтобы решить эту проблему простым способом, я экспериментировал с использованием пустых определений перечислений. Эффективно делает идентификатор пользователя типа данных (не заходя так далеко, как класс или структуру):
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!!
}
Что ты думаешь?
Почему? Вы добавили значительную сложность для того, чтобы предотвратить опечатки? Я думаю, что немного переборщить, чтобы закодировать кого-то, используя неправильную переменную. – cthom06
После прочтения вашего вопроса во второй раз, я понимаю, кажется, вы пытаетесь ограничить имя arg. Это чрезмерное убийство. Почему каждый хотел бы это сделать? Разве это не тот тип, который должен выполнять эту работу? –
Это мысленный эксперимент. Я подумывал применить его специально к значениям первичного ключа в моей модели. Я не предлагаю, чтобы мы все начали писать такой код, у меня появилась идея и подумал, что думают люди. –