Инструменты разработчика: Guard Clauses
Полезности | создано: 26.01.2022 | опубликовано: 26.01.2022 | обновлено: 13.01.2024 | просмотров: 2087
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 - альтернатива