Создаём Защитные Предложения
Защитные предложения (Guard Clause) в .NET — это простые проверки данных или условий в начале функции или метода.
Преимущества:
- уменьшают сложность и повышают читаемость, позволяя избегать глубокой вложенности кода;
- повышают безопасность и надёжность кода, проверяя входные данные или условия в начале, предотвращая потенциальные ошибки во время выполнения или непредвиденное поведение;
- проясняют цель кода, явно указывая предварительные условия, необходимые для правильного выполнения последующего кода.
Обычно проверка входных данных выглядит примерно так:
public class Person
{
public string Name { get; private set; }
public Person(string name)
{
if (string.IsNullOrEmpty(name))
throw new ArgumentException(
"Имя не может быть пустым.",
nameof(name));
Name = name;
}
}
Здесь всё просто. Спорный вопрос про выброс исключения в случае невалидных данных, но сейчас не об этом. Что здесь не так? В принципе, всё нормально, кроме читаемости кода. А что, если проверок будет больше?
Создадим статический метод для проверки условий.
public static class Ensure
{
public static void NotNullOrEmpty(
string? value,
[CallerArgumentExpression("value")]
string? paramName = null)
{
if(string.IsNullOrEmpty(value))
throw new ArgumentException(
"Значение не может быть пустым",
paramName);
}
}
Здесь вместо того, чтобы постоянно передавать имя параметра, для которого выдаётся исключение, мы используем атрибут CallerArgumentExpression, передавая ему имя нужного параметра. Во время выполнения это значение будет прочитано и присвоено атрибуту paramName.
Теперь работа по проверке условий и выбросу исключений ложится на отдельный класс, а код проверяемого класса проще:
public Person(string name)
{
Ensure.NotNullOrEmpty(name);
//…
}
Многие разработчики уже создали качественные библиотеки для этой же цели.
Вот некоторые из них:
- Ardalis
- Dawn
- Throw
Какую бы вы ни выбрали, у вас не возникнет никаких проблем. А если вам хочется большего контроля, вы всегда можете создать собственное защитное предложение, как показано выше.
Источник: https://stefandjokic.tech/posts/how-to-create-dotnet-custom-guard-clause