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