Бросить исключение или просто вернуть строку? - PullRequest
0 голосов
/ 13 мая 2018

Скажите, у меня есть эта функция, которая проверяет данные пользователя

//check valid user's details.
private bool checkUserDatails(String nickname, String groupId)
{
    //check nickname
    if ((nickname == null || nickname.Trim().Equals("")))
    {
        return false;
    }

    //check groupId
    if (groupId == null)
        return false;

    //convert to int
    int id;
    try
    {
        id = int.Parse(groupId);
    }
    catch (Exception) { return false; }

    //check id
    if (id < 0 | id > 100)
        return false;

    return true;
}

Это прекрасно работает, но функция вызывающей стороны не знает, почему функция вернула false, если она это сделала. Моей первоначальной мыслью было создать свои собственные исключения, такие как IncorrectUsernameException и т. Д., И выбросить их. Я также мог бы сделать строку возвращаемого значения и просто вернуть «Неверное имя пользователя».

Какой правильный подход C # к этому?

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

В соответствии с соглашениями Microsoft (по крайней мере, в некоторых местах) это должно выглядеть следующим образом:

private void EnsureValidDetails(string nickname, string groupId)
{
    if (string.IsNullOrWhiteSpace(nickname))
    {
        throw new ArgumentNullException(nameof(nickname));
    }
    else if (string.IsNullOrEmpty(groupId))
    {
        throw new ArgumentNullException(nameof(groupId));
    }

    int parsedGroupId;

    if (!int.TryParse(groupId, out parsedGroupId))
    {
        // or some better wording
        throw new ArgumentException("GroupId is not a valid number."); 
    }

    if (parsedGroupId < 0 || parsedGroupId > 100)
    {
        throw new ArgumentOutOfRangeException("GroupId must be between 0 and 100.");
    }
}

Обратите внимание, что этот метод делает больше, чем должен.groupId должен быть параметром int, и метод должен только проверять, находится ли значение в допустимом диапазоне:

private void EnsureValidDetails(string nickname, int groupId)
{
    if (string.IsNullOrWhiteSpace(nickname))
    {
        throw new ArgumentNullException(nameof(nickname));
    }
    else if (groupId < 0 || groupId > 100)
    {
        throw new ArgumentOutOfRangeException("GroupId must be between 0 and 100.");
    }
}

Тем не менее, это может быть не лучшим способом на самом деле проверить этот видвещей.Он, безусловно, работает как универсальный, независимый от фреймворка способ, но некоторые .NET-фреймворки (WPF, WCF, WinForms, ASP.NET) предоставляют встроенные способы сделать это.

0 голосов
/ 13 мая 2018

Вы не должны выдавать исключение, так как, вероятно, довольно часто возвращается значение false.Это может привести к довольно значительному снижению производительности.Вместо этого вы можете, например, использовать enum со значениями, такими как correct, invalid_nickname, invalid_id и т. Д.

enum CheckUserDetailsResult { correct, invalid_nickname, invalid_id }

В качестве альтернативы вы можете предоставить сообщение черезиз ссылки так:

private bool checkUserDetails (String nickname, String groupId, out String message)
{
    if (String.IsNullOrEmpty (nickname))
    {
        message = "Invalid nickname!";
        return false;
    }
    //and so on
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...