@aaltqna

Как правильнее создавать инстанс класса, все инициализирующие методы которого будут выполнены только внутри самого класса?

Заловок, возможно, не совсем понянет, но вот пример:

( javascript, но интересует общая концепция. Ну или еще и ruby в частности )
class Geomap {
  constructor( options={} ) {
    this.options = options;
  }
  // methods
}


Для инициализации я хочу просто вызвать сам класс и все, например:
new Geomap( {} );

// т.е. без сохранения инстанса в переменную и без просто вызовов методов из вне, типа
// const geomap = new Geomap( {} );
// geomap.init( );
// или
// ( new Geomap( {} ) ).init( );


Способов, конечно, много:
// *** 1 ***
class Geomap {
  constructor( options={} ) {
    this.options = options;
    // methods call
  }
  // methods
}
// *** 2 ***
class Geomap {
  constructor( options={} ) {
    this.options = options;

    this.init( );
  }
   
  init() {
    // methods call
  }
  // methods
}
// *** 3 ***
class Geomap {
  constructor( options={} ) {
    this.options = options;
  }
   
  static call( options={} ) {
    new this( options ).init( );
  }

  init( ) {
  }
  // methods
}


и т.д. Но как правильнее?
  • Вопрос задан
  • 124 просмотра
Пригласить эксперта
Ответы на вопрос 4
black1277
@black1277
Вольный стрелок
Сделайте класс со статическими методами и свойствами, но не используйте это
new Geomap( {} );
потому что по завершении всех функций - созданный объект будет удален. Можно, конечно сделать внутри вечно ожидающие кэлбеки, которые через замыкание будут держать объект в памяти, но для чего это нужно я не представляю - проще использовать тогда паттерн модуля, вместо класса.
Ответ написан
Alexandroppolus
@Alexandroppolus
кодир
Такой класс не имеет смысла. Проще создать функцию, которая всё сделает.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Непонятно целеполагание. Автор хочет что-то сделать зачем?

Непонятно зачем тегать ООП ? В наше время сферического ООП не существует. Есть ООП в реализации конкретных языков. И оно очень сильно отличается. Например в некоторых языках все объекты - суть прототипы. В других не так.

Добавил версию с тегами js, ruby. И давайте обсуждать вот в разрезе языков. А то запутаемся совсем.
Ответ написан
Комментировать
@tin_vsl
Senior Developer
в Ruby для такого активно используют Service Objects, почти как в вашем третьем примере с методом call

https://www.toptal.com/ruby-on-rails/rails-service...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы