Лучший способ / практика для организации кода для метода проверки C#

Мне интересно, что было бы лучшим способом или организовать код, когда вы делаете проверку?

Вложены ли или вернутся на первое место, если ваша проверка не удалась?

Это первый способ, который я сделал, сосредоточиться на успешном сценарии, используя вложенные

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value!= null && value.GetType().Equals(typeof(string)))
        {
            var text = value.ToString();
            if (Regex.IsMatch(text, "^[-+]?[0-9]{1,2}.?[0-9]{0,6}?,[-+]?[0-9]{1,3}.?[0-9]{0,6}?$"))
            {
                var cordinations = text.Split(',');
                if (cordinations.Length == 2)
                {
                    decimal latitude = 0;
                    decimal longitude = 0;
                    if (decimal.TryParse(cordinations[0].Replace(" ", string.Empty), out latitude) && decimal.TryParse(cordinations[1].Replace(" ", string.Empty), out longitude))
                    {
                        if ((latitude >= -90 && latitude <= 90) && (longitude >= -180 && longitude <= 180))
                            return ValidationResult.Success;
                    }
                }
            }
        }
        return new ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName));
    }

Это второй способ, который я сделал, сосредоточиться на неудачных сценариях

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value==null)
            return new ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName));
        if (!value.GetType().Equals(typeof(string)))
            return new ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName));

        var text = value.ToString();
        if (!Regex.IsMatch(text, "^[-+]?[0-9]{1,2}.?[0-9]{0,6}?,[-+]?[0-9]{1,3}.?[0-9]{0,6}?$"))
            return new ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName));

        var cordinations = text.Split(',');
        if (cordinations.Length != 2)
            return new ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName));

        decimal latitude = 0;
        decimal longitude = 0;
        if (!decimal.TryParse(cordinations[0].Replace(" ", string.Empty), out latitude) || 
            !decimal.TryParse(cordinations[1].Replace(" ", string.Empty), out longitude))
            return new ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName));

        if (!(latitude >= -90 && latitude <= 90) || !(longitude >= -180 && longitude <= 180))
            return new ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName)); .
        return ValidationResult.Success;
    }

Какой из них будет считаться лучшей практикой в ​​этот день. Или любой другой способ сделать это. Я был бы очень признателен за ваши идеи, может быть, какие-либо ссылки Microsoft предлагает?

1 ответ

На мой взгляд, второй способ лучше, так как он предотвращает вложение и является более дружественным кодом, то есть код может быть легко поддержан. Однако вы можете улучшить его, добавив ValidationResult вверху и обновляйте этот экземпляр при каждой проверке, чтобы в итоге иметь только одну инструкцию возврата внизу.

Я имею в виду что-то вроде этого:

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    var rtn = new ValidationResult();

    if (value==null)
        rtn  = ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName));
    if (!value.GetType().Equals(typeof(string)))
        rtn =  ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName));

    var text = value.ToString();
    if (!Regex.IsMatch(text, "^[-+]?[0-9]{1,2}.?[0-9]{0,6}?,[-+]?[0-9]{1,3}.?[0-9]{0,6}?$"))
        rtn  = ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName));

    var cordinations = text.Split(',');
    if (cordinations.Length != 2)
        rtn  = ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName));

    decimal latitude = 0;
    decimal longitude = 0;
    if (!decimal.TryParse(cordinations[0].Replace(" ", string.Empty), out latitude) || 
        !decimal.TryParse(cordinations[1].Replace(" ", string.Empty), out longitude))
        rtn  = ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName));

    if (!(latitude >= -90 && latitude <= 90) || !(longitude >= -180 && longitude <= 180))
        rtn  =  ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName)); .

    if(rtn.HasNoError) rtn = ValidationResult.Success; // or something of the like

    return rtn;
}

Это помогает вам в отладке, предотвращая возврат кода где-то в середине метода. Надеюсь, поможет

Другие вопросы по тегам