2011-10-03 145 views
0

我寫的Web應用程序太複雜了,我想簡化我的組件如何協同工作。我有幾個單身人士「知道」他們所要做的所有事情。擺脫單身?

例如,我有一個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--它們創建的),這看起來不太好。

+0

你做什麼像一個窗口管理器的聲音 - 有沒有什麼錯的,但它是一種很難說沒有能夠看到更多的代碼和理解的你的複雜性」重新談論。 – Stephen

+0

好吧,你有這個課程,你剛剛創建了一個實例。爲該類添加邏輯以防止創建更多實例,實際上幫助了您?你有沒有想過創造更多的實例?如果您不小心編寫了代碼來創建另一個實例,Singleton邏輯需要多長時間實際提醒您注意這一事實? - 另一方面,你的抱怨是這些情況「知道的比他們應該的更多」;除了「這裏有一堆Window實例」,WindowSystem究竟知道什麼? –

+0

@Karl,@Stephen:我添加了代碼。 「系統」之間來回傳遞的函數太多,這讓我覺得有一種更好的方法來實現它。 – JustcallmeDrago

回答

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; 
0

手動依賴注入可以由一個單例提供。我知道你試圖擺脫那些,但如果你有一個跟蹤所有有趣的實例(如窗口),你可以說像Injector.get("Window", "Debug");這樣的東西來抓住你的調試代碼想要的任何窗口實例。這仍然給你注入 - 如果需要,可以向Debug類提供一個不同的窗口,並且可以通過多種方式(數據,硬編碼等)配置提供的類實例的配置。

您也可以使用Injector.getAll("Window")來獲取和關閉它們。

我意識到你仍然有一個單身人士,但至少它只是一個,它提供了一些靈活性,以便在一個地方重新配置你的課程。

+1

Java不是Javascript。儘管一些概念可能在兩者之間轉換,但Spring除了想要在JS中效仿Spring之外,並不會幫助其他人 - 而且這可能需要很多工作。 – cHao

+0

我改變了建議 - 仍然建議注射,但手動而不是自動。如果這樣做不應該太多的工作。 –