Лучший способ / практика для организации кода для метода проверки 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;
}
Это помогает вам в отладке, предотвращая возврат кода где-то в середине метода. Надеюсь, поможет