Как создать внешний конструктор для класса с приватными сеттерами? - PullRequest
0 голосов
/ 11 октября 2019

Есть ли какой-нибудь способ построить класс из внешнего класса компоновщика, не позволяя их установщикам быть открытыми? Я не хочу, чтобы недопустимый экземпляр класса существовал без необходимых проверок.

Единственный способ, который я нашел до сих пор, - это создание конструктора с необходимыми параметрами и проверками.

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

    public class Computer
    {
        public string Motherboard { get; private set; }
        public string RamMemory { get; private set; }
        public string Cpu { get; private set; }

        public Computer(string motherboard, string ramMemory, string cpu)
        {
            ValidateMotherboard(motherboard);
            ValidateRamMemory(ramMemory);
            ValidateCpu(cpu);

            Motherboard = motherboard;
            RamMemory = ramMemory;
            Cpu = cpu;
        }

        private void ValidateMotherboard(string motherboard)
        {
            if (motherboard == null)
                throw new ArgumentNullException(nameof(motherboard));
        }

        private void ValidateRamMemory(string ramMemory)
        {
            if (ramMemory == null)
                throw new ArgumentNullException(nameof(ramMemory));
        }

        private void ValidateCpu(string cpu)
        {
            if (cpu == null)
                throw new ArgumentNullException(nameof(cpu));
            else if (!cpu.ToLower().Contains("ryzen"))
                throw new ArgumentException("Only AMD Ryzen CPU's is good enough.");
        }
    }

    public class ComputerBuilder
    {
        private string _motherboard;
        private string _ramMemory;
        private string _cpu;

        public ComputerBuilder SetMotherboard(string motherboard)
        {
            _motherboard = motherboard;
            return this;
        }

        public ComputerBuilder SetRamMemory(string ramMemory)
        {
            _ramMemory = ramMemory;
            return this;
        }

        public ComputerBuilder SetCpu(string cpu)
        {
            _cpu = cpu;
            return this;
        }

        public Computer Build() => new Computer(_motherboard, _ramMemory, _cpu);
    }

Я просто хочу иметь конструкторы, которые упрощают построение классов со слишком большим количеством параметров. Любые идеи о том, как сделать так, чтобы валидаторы создавались без допущения существования недопустимого экземпляра?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...