понедельник, 22 мая 2017 г.

Может быть только один первичный конструктор

Я предлагаю классифицировать конструкторы классов в ООП как первичные и вторичные. Первичный конструктор - это тот, который создает объект и инкапсулирует другие объекты внутри него. Вторичный - это просто шаг подготовки перед вызовом первичного конструктора и на самом деле не является конструктором, а скорее вводным слоем перед реальным механизмом конструирования.

Вот что я имею в виду:
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
}
Здесь не так много кода, но дублирование массивно и уродливо; Надеюсь, вы сами это увидите.
Строго следуя этому предложенному правилу, все классы будут иметь единственную точку входа, которая является основным конструктором, и ее всегда легко найти, потому что она остается ниже всех вторичных конструкторов.

1 комментарий:

  1. Егор, я пишу декоратор который будет валидировать базовый объект (с первичным конструктором). Я слышал от вас в видео на youtobe, что Exception в конструкторе это плохо. Это распространяется и на (вторичные) конструкторы декораторов?
    Я не могу уловить где мне проверять новый объект. С тем что при любой операции (которую нам предоставляет интерфейс сущности) над уже существующим объектом у меня пойдет цепочка вызовов через верхний декоратор к нижнему и где то пройдет проверка мне понятно. А как быть с новым объектом вот мы только что его создали и нам нужно его сохранить. Или мне в базовый объект добавить новый метод save к примеру и проводить валидацию еще там? Но это как то не логично и кажется не избежать дублирования и мне кажется
    этот метод раскроет внутреннее устройство моего объекта. Метод init мне тоже не нравится не должно быть его. Я склоняюсь что нужно в конструкторе декоратора валидации выбрасывать исключение если данные не валидны.
    P.S. Жду вашего ответа. Заранее спасибо.

    ОтветитьУдалить