Инструменты разработчика: Guard Clauses

Полезности | создано: 26.01.2022 | опубликовано: 26.01.2022 | обновлено: 13.01.2024 | просмотров: 1500

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));
	}
}

Заключение

В качестве заключения всего одна фраза. Как говорится, "Почувствуйте разницу!"

Ссылки

GuardClauses на GitHub

GuardClauses в пакете Nuget

Using Guard Clauses in .NET - XamGirl - альтернатива