В настоящее время мы продолжаем длительный процесс написания некоторых стандартов кодирования для С#.
Недавно я написал метод с сигнатурой
string GetUserSessionID(int UserID)
GetUserSession() возвращает null в случае, если сеанс не найден для пользователя.
в моем кодовом коде... Я говорю...
string sessionID = GetUserSessionID(1)
if (null == sessionID && userIsAllowedToGetSession)
{
session = GetNewUserSession(1);
}
В недавнем обзоре кода рецензент сказал: "Вы никогда не должны возвращать null из метода, поскольку он ставит больше работы над вызывающим методом для проверки нулей".
Сразу же я закричал, как будто вы вернули строку. Возможно, вам еще нужно выполнить какую-то проверку на возвращаемое значение.
if (string.Empty == sessionID)
Однако, подумав об этом, я никогда не верну null в случае коллекции/массива/списка. Я бы вернул пустой список.
Решение этой проблемы (я думаю) должно было бы реорганизовать это на 2 метода.
bool SessionExists(int userID);
и
string GetUserSessionID(int UserID);
На этот раз GetUserSessionID будет генерировать исключение SessionNotFound (так как он не должен возвращать null)
теперь код будет выглядеть как...
if(!SessionExists(1) && userIsAllowedToGetSession))
{
session = GetNewUserSession(1);
}
else
{
session = GetUserSessionID(1);
}
Теперь это означает, что нет нулей, но для меня это кажется немного более сложным. Это также очень простой пример, и мне было интересно, как это повлияет на более сложные методы.
Существует много рекомендаций по практической рекомендации о том, когда бросать исключения и как их обрабатывать, но, похоже, меньше информации об использовании null.
Есть ли у кого-нибудь еще какие-либо твердые рекомендации (или даже более высокие стандарты) относительно использования нулей и что это означает для типов с нулевым значением (мы вообще должны их использовать?)
Спасибо заранее,
Крис.
=====
Спасибо всем! Здесь много интересного.
Я дал ответ эгаге, поскольку мне нравится предложение Get vs Find в качестве руководства по кодированию, но все были интересными ответами.