Я предлагаю классифицировать конструкторы классов в ООП как первичные и вторичные. Первичный конструктор - это тот, который создает объект и инкапсулирует другие объекты внутри него. Вторичный - это просто шаг подготовки перед вызовом первичного
конструктора и на самом деле не является конструктором, а скорее вводным
слоем перед реальным механизмом конструирования.
Вот что я имею в виду:
final class Cash { private final int cents; private final String currency; public Cash() { // secondary this(0); } public Cash(int cts) { // secondary this(cts, "USD"); } public Cash(int cts, String crn) { // primary this.cents = cts; this.currency = crn; } // methods here }
В классе есть три конструктора - только один является первичным, а два других - вторичными. Мое определение вторичного конструктора простое: он не делает ничего, кроме вызова первичного конструктора, через this (..).
Я хочу сказать, что класс правильно созданного класса должен иметь только один основной конструктор, и он должен быть объявлен после всех вторичных. Зачем? Только одна причина: это помогает устранить дублирование кода.
Без такого правила у нас может быть такая конструкция для нашего класса:
Я хочу сказать, что класс правильно созданного класса должен иметь только один основной конструктор, и он должен быть объявлен после всех вторичных. Зачем? Только одна причина: это помогает устранить дублирование кода.
Без такого правила у нас может быть такая конструкция для нашего класса:
final class Cash { private final int cents; private final String currency; public Cash() { // primary this.cents = 0; this.currency = "USD"; } public Cash(int cts) { // primary this.cents = cts; this.currency = "USD"; } public Cash(int cts, String crn) { // primary this.cents = cts; this.currency = crn; } // methods here }
Здесь не так много кода, но дублирование массивно и уродливо; Надеюсь, вы сами это увидите.
Строго следуя этому предложенному правилу, все классы будут иметь единственную точку входа, которая является основным конструктором, и ее всегда легко найти, потому что она остается ниже всех вторичных конструкторов.
Строго следуя этому предложенному правилу, все классы будут иметь единственную точку входа, которая является основным конструктором, и ее всегда легко найти, потому что она остается ниже всех вторичных конструкторов.
Егор, я пишу декоратор который будет валидировать базовый объект (с первичным конструктором). Я слышал от вас в видео на youtobe, что Exception в конструкторе это плохо. Это распространяется и на (вторичные) конструкторы декораторов?
ОтветитьУдалитьЯ не могу уловить где мне проверять новый объект. С тем что при любой операции (которую нам предоставляет интерфейс сущности) над уже существующим объектом у меня пойдет цепочка вызовов через верхний декоратор к нижнему и где то пройдет проверка мне понятно. А как быть с новым объектом вот мы только что его создали и нам нужно его сохранить. Или мне в базовый объект добавить новый метод save к примеру и проводить валидацию еще там? Но это как то не логично и кажется не избежать дублирования и мне кажется
этот метод раскроет внутреннее устройство моего объекта. Метод init мне тоже не нравится не должно быть его. Я склоняюсь что нужно в конструкторе декоратора валидации выбрасывать исключение если данные не валидны.
P.S. Жду вашего ответа. Заранее спасибо.