我正在编写一个过于复杂的网络应用程序,我想简化我的组件协同工作的方式。我有一些单身人士“知道”他们所要处理的所有物品。
例如,我有一个windowSystem
,其中包含存在的所有window
个对象的数组。所有的窗户对彼此一无所知,但我有一个令人恼火的单身人士,比如closeAllWindows()
函数或if(sameWindowExists()) { return }
类型的东西(我认为)需要某种方式来保持跟踪所有windows
。我的程序启动时创建了一个windowSystem
实例。
感觉这些是不必要的,因为他们知道的比他们应该的更多。我还有其他选择吗?
修改:以下是一些显示各种_____System
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
- 他们创造的那样 - 并没有'似乎规模很大。
答案 0 :(得分:0)
手动依赖注入可由一个单身人士提供。我知道你正试图摆脱这些,但如果你有一个跟踪所有有趣的实例(如窗口),你可以说Injector.get("Window", "Debug");
之类的东西来抓取你的调试代码想要的任何窗口实例。这仍然为您提供注入 - 如果需要,可以向Debug类提供不同的窗口,并且可以通过多种方式(数据,硬编码等)配置提供的类实例的配置。
然后,您也可以使用Injector.getAll("Window")
来获取和关闭它们。
我意识到你还有一个单身人士,但至少它只是一个,它为你提供了一些灵活性,可以在一个地方重新配置你的课程。
答案 1 :(得分:0)
您可以尝试将其转移到所有窗口继承的基类,而不是让您的窗口在窗口上方的单例中管理逻辑。它可能看起来像:
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;