В блоге:

2020-10-18

Объекты без конструкторов и полей (рабочий концепт)

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

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


Поэтому такой мой концепт. Даже не концепт, а экспериментальном вариант, который уже используется в некотором языке программирования. В принципе, такой подход можно взять на вооружение и в обычных языках (что я и делаю).

Конструктором является метод. Можно считать его специальным, но по сути это обычный метод. Но сам метод не выполняется в контексте нового объекта. Более того, в момент подготовки данных в методе объекта ещё нет.

Уже после инициализации данных в методе создается новый объект. Но в объекте нет полей, которые требуют инициализации. А состояние объекта хранится через замыкания (closure) локальных переменных этого метода.

Вместо тысячи слов пример (на некотором условном языке c немного условным синтаксисом):

def Counter(startValue: Int) = {
  var value = startValue
  new { 
    def next(): Int = {
      val ret = value
      value = value + 1
      ret
    }
    def reset(): () = {
      value = startValue
    }
  }
}


В данном примере переменная value фактически является скрытым полем, которое представляет состояние объекта.

0 comments:

Post a Comment

Blog Archive