Инструменты разработчика: Guard Clauses
Полезности | создано: 26.01.2022 | опубликовано: 26.01.2022 | обновлено: 13.01.2024 | просмотров: 1734
Guard Clauses - упрощает сложные функции, «failing fast», заранее проверяя наличие недопустимых входных данных и немедленно выкидывая исключения, если таковые обнаружены.
Инструменты разработчика
Хочется кратко рассказать о том, что это за инструмент. И если следовать желанию, то это простой и эффективный способ валижировать переменные в коде. Очень удобно, кратко, эффективно, красиво (в конце концов). Чтобы было понятно, приведу два примера, без использования библиотеки и с использованием библиотеки.
Пример "без использования"
Так обычно пишется код проверки переменных, когда не используется упомянутый выше инструмент:
public void ProcessOrder(Order order)
{
if (order is null)
{
throw new ArgumentNullException(nameof(order));
}
// process order here
}
public class Order
{
private string _name;
private int _quantity;
private long _max;
private decimal _unitPrice;
private DateTime _dateCreated;
public Order(string name, int quantity, long max, decimal unitPrice, DateTime dateCreated)
{
if (string.IsNullOrWhiteSpace(name))
{
throw new ArgumentNullException("Name is required", nameof(name));
}
_name = name;
if (quantity <= 0)
{
throw new InvalidOperationException("Quantity is less than zero");
}
_quantity = quantity;
if (max == 0)
{
throw new InvalidOperationException("Max should be not equals zero");
}
_max = max;
if (unitPrice < 0)
{
throw new InvalidOperationException("UnitPrice should be not equals zero");
}
_unitPrice = unitPrice;
if (dateCreated < new DateTime(552877920000000000L) || dateCreated > new DateTime(3155378975999970000L))
{
throw new ArgumentException("DateCreated should be in SQL date range", nameof(_dateCreated));
}
_dateCreated = dateCreated;
}
}
Пример "с использованием"
А теперь всё тоже самое, только с использованием библиотеки расширений:
public void ProcessOrder(Order order)
{
Guard.Against.Null(order, nameof(order));
// process order here
}
public class Order
{
private string _name;
private int _quantity;
private long _max;
private decimal _unitPrice;
private DateTime _dateCreated;
public Order(string name, int quantity, long max, decimal unitPrice, DateTime dateCreated)
{
_name = Guard.Against.NullOrWhiteSpace(name, nameof(name));
_quantity = Guard.Against.NegativeOrZero(quantity, nameof(quantity));
_max = Guard.Against.Zero(max, nameof(max));
_unitPrice = Guard.Against.Negative(unitPrice, nameof(unitPrice));
_dateCreated = Guard.Against.OutOfSQLDateRange(dateCreated, nameof(dateCreated));
}
}
Заключение
В качестве заключения всего одна фраза. Как говорится, "Почувствуйте разницу!"
Ссылки
Using Guard Clauses in .NET - XamGirl - альтернатива