class CalculationResult<T>
{
public static CalculationResult<T> Success(T result)
{
return new CalculationResult<T>
{
IsSuccess = true,
Result = result
};
}
public static CalculationResult<T> Failure(Exception error)
{
return new CalculationResult<T>
{
IsSuccess = false,
Error = error
};
}
public bool IsSuccess { get; private set; }
public Exception Error { get; private set; }
public T Result { get; private set; }
}
Класс CalculationResult<T>
использует инкапсуляцию, чтобы задать контракт:
IsSuccess == true
, то Result
задан, вычисление завершилось без исключенийIsSuccess == false
, то Result
не задан, вычисление завершилось с исключениемПользователь этого класса не имеет возможность изменить его поведение и нарушить консистентность данных.
По code-style на работе я не могу использовать инкапсуляцию. Данные и методы, с ними работающие, должны быть строго разделены. Поэтому фабричные методы выделяются в отдельный интерфейс:
interface ICalculationResultBuilder
{
CalculationResult<T> Success<T>(T result);
CalculationResult<T> Failure<T>(Exception error);
}
При этом все private set;
я вынужден заменить по крайней мере на internal set;
. Это чревато тем, что теперь пользователь класса может проигнорировать ICalculationResultBuilder
и сделать так:
new CalculationResult<int>
{
IsSuccess = true,
Error = new Exception(),
Result = 42
};
Подскажите другие средства языка и способы гарантированно ограничить пользователя в способах прострелить себе ногу?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Как по нажатию на кнопку в новом pdf вывести дату и содержимое файла filepdf с кирилической записью? Нашел варианты которые работают по отдельности,...
Появились ошибки на сайтеПонадобилось при регистрации на сайте загружать изображение, но при попытке загрузить получаю ошибку ERROR: Internal...
Я вывожу таблицу, и вывожу в ней также роль пользователя