Как создать ValueObject без инкапсуляции?

122
08 ноября 2021, 16:50
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
};

Подскажите другие средства языка и способы гарантированно ограничить пользователя в способах прострелить себе ногу?

READ ALSO
Замена элемента массива, хранящегося в ячейке БД

Замена элемента массива, хранящегося в ячейке БД

У меня в в БД данные хранятся в виде

80
Как поверх pdf вывести надпись на кирилице? tfpdf, fpdi

Как поверх pdf вывести надпись на кирилице? tfpdf, fpdi

Как по нажатию на кнопку в новом pdf вывести дату и содержимое файла filepdf с кирилической записью? Нашел варианты которые работают по отдельности,...

136
PHP Fatal error: Cannot redeclare ihc_init() Как исправить?

PHP Fatal error: Cannot redeclare ihc_init() Как исправить?

Появились ошибки на сайтеПонадобилось при регистрации на сайте загружать изображение, но при попытке загрузить получаю ошибку ERROR: Internal...

108
Yii2 , Rbac, как правильно вывести имя роли d GridVIew

Yii2 , Rbac, как правильно вывести имя роли d GridVIew

Я вывожу таблицу, и вывожу в ней также роль пользователя

113