Избавляемся от синглетонов? - PullRequest
0 голосов
/ 04 октября 2011

Я пишу веб-приложение, которое становится слишком сложным, и я хотел бы упростить, как мои компоненты работают вместе.У меня есть несколько синглетонов, которые «знают» обо всех объектах, с которыми они имеют дело.

Например, у меня есть windowSystem, который содержит массив всех window существующих объектов.Все окна ничего не знают друг о друге, но у меня есть этот раздражающий синглтон для таких вещей, как closeAllWindows() функция или if(sameWindowExists()) { return } -типа, которые (я думаю) требуют какой-то способ отслеживания всехwindows.Я создаю один windowSystem экземпляр при запуске моей программы.

Такое ощущение, что они не нужны, потому что они знают больше, чем должны.Какие еще варианты у меня есть?

Редактировать: Вот код, показывающий создание различных _____System s

var refDate = usDate.now();

    var eventSystem = usEventSystem($("#topLevelElement")),
        backend = usBackend(eventSystem.trigger),
        windowSystem = usWindowSystem($("#windows"), eventSystem.registerEvent),
        timelineSystem = usTimelineSystem($("#view"), 
                                        backend.getEvents, 
                                        usDate.now().shift({ hours:-6 }), 
                                        usDate.now().shift({ hours:6 }),
                                        eventSystem.registerEvent,
                                        eventSystem.unregisterEvent,
                                        windowSystem.createWindow);

    usWindow.setRegisterEventFunc(eventSystem.registerEvent).setUnregisterEventFunc(eventSystem.unregisterEvent);                           

Что мне действительно не нравится в этомв том, что я передаю множество функций из других систем друг в друга (и они, в свою очередь, передают их объектам - как window - они создают), которые, кажется, плохо масштабируются.

Ответы [ 2 ]

0 голосов
/ 04 октября 2011

Вместо того, чтобы ваша логика управления окнами находилась в одиночном положении над окнами, вы можете попробовать перенести ее в базовый класс, от которого наследуются все окна.Это может выглядеть примерно так:

function BaseWindow() {
    //whatever common constructor logic you may want
    //such as creating an id
    this.id = this.id + 1
}

//this is static
BaseWindow.activeWindow = null;

//this is a property visible to each window instance but is updated by the base class
BaseWindow.prototype.id = 0;

//this is a property visible to each window instance but may be overridden by a subclass
BaseWindow.prototype.name = "BaseWindow";

//this is function visible to each window instance
BaseWindow.prototype.show = function ( ) {
    //hide BaseWindow.activeWindow then show "this" window;
};


function WindowA() {
    //do some window specific stuff like set the window name
    this.name = "WindowA";
}

WindowA.prototype = new BaseWindow;
0 голосов
/ 04 октября 2011

Внедрение зависимостей вручную может быть обеспечено одним синглтоном.Я знаю, что вы пытаетесь избавиться от них, но если бы у вас был один, который отслеживал все ваши интересные экземпляры (например, окна), вы могли бы сказать что-то вроде Injector.get("Window", "Debug");, чтобы получить любой экземпляр окна, который хочет ваш код отладки.Это все еще дает вам инъекцию - при необходимости для класса Debug может быть предоставлено другое окно, а конфигурация предоставленных экземпляров класса может быть настроена несколькими способами (данные, жестко запрограммированы и т. Д.).

Вы также можете затем использовать Injector.getAll("Window"), чтобы получить и закрыть их все.

Я понимаю, что у вас все еще есть синглтон, но, по крайней мере, он один, и он дает вам некоторую гибкость для перенастройки вашегозанятия в одном месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...