2011-10-03 8 views
0

너무 복잡해지고있는 웹 앱을 작성 중이므로 구성 요소가 어떻게 작동하는지 간략하게 설명하고자합니다. 나는 그들이해야하는 모든 객체에 대해 "알고있는"몇 개의 싱글 톤을 가지고있다.싱글 톤 제거하기?

예를 들어, 존재하는 모든 window 개체의 배열을 보유하고있는 windowSystem이 있습니다. 모든 창문은 서로에 대해 아무 것도 몰라요. 그러나 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

: 그것은 같은 것을 볼 수 있었다 다시 얘기하고있어. – Stephen

+0

자, 이제이 클래스가 생겼고 방금 하나의 인스턴스를 만들었습니다. 더 많은 인스턴스를 만들지 못하도록 해당 클래스에 논리를 추가했는데 실제로 도움이 되었습니까? 더 많은 인스턴스를 만들려고 유혹에 빠졌습니까? 실수로 다른 인스턴스를 작성하는 코드를 작성한 경우 Singleton 로직이 사실을 알리는 데 얼마나 오랜 시간이 걸릴 것입니까? - 또 다른 메모에서 귀하의 불만은 이러한 사례가 "필요한 것 이상을 알고 있음"입니다. 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

자바는 자바 스크립트가 아닙니다. 몇 가지 개념이 둘 사이에서 옮겨 질지도 모르지만 Spring이 JS에서 Spring을 에뮬레이트하고 싶지 않으면 Spring이 누군가를 돕지 않습니다. 이는 많은 작업이 될 수 있습니다. – cHao

+0

나는 제안을 바꾸었다. - 여전히 주사를 제안했지만 수동이 아니라 자동으로. 그렇게한다면 너무 많은 일을해서는 안됩니다. –