Есть ли альтернативный способ обеспечить проверку модели? - PullRequest
0 голосов
/ 07 ноября 2019

Чтобы 1. прояснить возможности интерфейса и, следовательно, 2. сократить количество тестов плюс 3. потерпеть неудачу как можно быстрее, я намерен обеспечить проверку модели при создании. Модель не должна быть создана, если созвездие недействительно. В результате каждому потребителю гарантируется, что предоставленная модель действительна.

Решение, которое я придумал, заключается в том, чтобы иметь частный конструктор и вложенный фабричный класс.

Но качество кодаправила сообщают о предупреждении проектирования: CA1034 : вложенные типы не должны быть видныКогда подавлять предупреждения: Не подавляйте предупреждение из этого правила.

Существуют ли альтернативные варианты для этого?

public class MyValidatedModel
{
    private readonly SomeOtherModel _a;
    private readonly SomeOtherModel _b;

    // cannot be constructed elsewhere to enforce validation
    private MyValidatedModel(SomeOtherModel a, SomeOtherModel b)
    {
        _a = a;
        _b = b;
    }

    public class Factory
    {
        private readonly ImmutableList<IValidator> _validators;

        // to allow override in tests where simplification wanted
        public Factory(IEnumerable<IValidator> validators)
        {
            this._validators = validators.ToImmutableList();
        }

        public MyValidatedModel Create(SomeOtherModel a, SomeOtherModel b)
        {
            // do some validation
            if (IsValid(a, b))
            {
                // create validated model
                return new MyValidatedModel(a, b);
            }

            // do some error handling
        }
    }
}

public class Consumer
{
    public DoStuff(MyValidatedModel model)
    {
        // here we know for sure that this model is valid
    }
}
...