@Shartonix

Наследование классов Java Script, какой вариант выбрать?

Уважаемые знатоки, здравствуйте. Мне нужно выбрать вариант, но ум за разум уже зашел. Два варианта полностью одинаковы за исключением пару мелочей, какой выбрать не знаю. Помогите вынести решение.

Имеется основной класс Main, в котором я подключаю другие классы(пакеты);

(function(){
    function __First(){
        //Конструктор
        console.log('First подключен');
    }
    First = __First;
})();
(function(){
    function __Second(){
        //Конструктор
        console.log('Second подключен');
    }
    Second = __Second;
})();
(function(){
    function __Main(){
        this.setPacks();
    }
    __Main.prototype.setPacks = function(){
        this.first = new First();
        this.second = new Second();
    };
    Main = __Main;
})();


Класс First и Second должны напрямую(!) использовать Main. В дополнение класс Second должен (так же напрямую) использовать First. В контексте именно Firs и Second классов мне не нужно делать Main их прототипом, и мне не нужно «примешивать» отдельные его методы и свойства. Поэтому делам так:

ВАРИАНТ А

(function(){
    function __First(main){
        //Конструктор
        console.log('First подлкючен');
        //Cылка на основной класс
        this.main = main;
        this.main.useMethod('First');
    }
    __First.prototype.forSecond = function(){
        console.log('Я First, меня использует Second');
    };
    First = __First;
})();
(function(){
    function __Second(main,first){
        //Конструктор
        console.log('Second подлкючен');
        /*Вариант А*/
        this.main = main;
        this.first = first;
        this.main.useMethod('Second');
        this.first.forSecond();
    }
    Second = __Second;
})();
(function(){
    function __Main(){
        this.setPacks();
    }
    __Main.prototype.useMethod = function(name){
        console.log('Мы пришли по ваши души из ' + name);
    };
    __Main.prototype.setPacks = function(){
        /*Вариант А*/
        this.first = new First(this);
        this.second = new Second(this,this.first);
    };
    Main = __Main;
})();


Или так (Исправляем только Main и Second) :

ВАРИАНТ Б

(function(){
    function __Second(first){
        //Конструктор
        console.log('Second подлкючен');
        /*Вариант Б*/
        this.first = first;
        //Подлкючаемся к основному классу через родителя
        this.first.main.useMethod('Second');
        this.first.forSecond();
    }
    Second = __Second;
})();
(function(){
    function __Main(){
        this.setPacks();
    }
    __Main.prototype.useMethod = function(name){
        console.log('Мы пришли по ваши души из ' + name);
    };
    __Main.prototype.setPacks = function(){
        /*Вариант Б*/
        this.first = new First(this);
        //Передаем только один класс
        this.second = new Second(this.first);
    };
    Main = __Main;
})();


Внимание вопрос.

Какой бы вы, уважаемые знатоки, выбрали вариант :

  1. Вариант А с передачей основного и дополнительного(дополнительных) класса(классов)

  2. Или вариант Б с получением доступа к основному классу через наследуемый, дополнительный (такой же пакет) класс



Какой вариант выбрать? (другие варианты не предлагать, интересуют только эти две вариации)

Заранее спасибо.
  • Вопрос задан
  • 330 просмотров
Пригласить эксперта
Ответы на вопрос 2
По сути - вам нужен DI контейнер, у вас получается так:
Сервис Main без зависимостей.
Сервис First должен получать в конструктор Main, т.е. должно выглядеть как-то так:
new First(mainInstance)
Сервис Second должен получать в конструктор Main и First, т.е.
new Second(mainInstance, firstInstance)
Это всё верно, если все три сервиса - синглтоны.
Если нет - то вместо instance должны быть вызовы new Constructor(...)
Загадкой остается, почему вы пытаетесь в Main создавать эти инстансы?
Если вы хотите всё вызывать через Main.foo - замиксиньте их в Main.
Ответ написан
Комментировать
@JSmitty
Несколько непонятно, почему у Main метод setPack не принимает First и Second как аргументы. Самое лучшее было бы сделать в First и Second инъекцию зависимостей через конструктор напрямую (и вариант с доступом через объект к другому объекту - хуже не придумать), а в Main - через метод setPack, типа:
const main = new Main();
const first = new First(main);
const second = new Second(first);
main.setPack(first, second);
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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