가능한 중복 :
Singletons에 대해 그렇게 나쁜 점은 무엇입니까?
어떤 경우에는 많은 디자인 패턴이 악용 될 수 있다는 것을 이해할 수 있으며, 엄마가 항상 말했듯이 "너무 많은 좋은 일이 항상 좋은 것은 아닙니다!"
나는 요즘, 싱글 톤을 많이 사용하고 있고, 디자인 패턴을 혼란스럽게하고 나쁜 습관을 더 깊고 깊게 실행하고 있을지 걱정됩니다.
우리는 사용자가 작업하는 동안 메모리에 보관되는 상당히 큰 계층 적 데이터 구조를 가진 Flex 애플리케이션을 개발 중입니다. 사용자는 필요할 때 데이터를로드, 저장, 변경 및 새로 고칠 수 있습니다.
이 데이터는 몇 개의 ArrayCollection, 배열, 값 객체 및 getter 및 setter를 통해 노출 된 일부 원시 멤버 변수를 집계하는 Singleton 클래스를 통해 중앙 집중화됩니다.
애플리케이션의 어느 곳에서나 우리 데이터에 대한 참조를 얻으려면 모든 Model.getInstance () 메소드 유형을 수행해야합니다. 모든 사람이 잘 알고있을 것입니다. 따라서 우리가 디자인 할 때 응용 프로그램 수명 동안 한 번만 인스턴스가 존재할 수 있다고 했으므로 항상 동일한 데이터 복사본을 손에 쥘 수 있습니다.
이 중앙 데이터 저장소에서 예를 들어 속성 변경 이벤트를 전달하기가 쉬우 며 중앙 데이터를 참조하는 여러 UI 구성 요소를 사용하여 발생 된 데이터 변경 내용을 반영하여 디스플레이를 업데이트 할 수 있습니다.
지금까지이 접근법은 효과적이었고 우리의 상황에 매우 실용적이었습니다.
그러나 나는 새로운 수업을 만들 때 조금 과식 해 보인다. 클래스가 Singleton이어야하는 것과 같은 질문, 또는 예를 들어 공장을 사용하는 것처럼 다른 방법으로 관리해야하는 경우 가끔은 약간의 불확실성으로 인해 때때로 어려워지는 경향이 있습니다.
싱글 톤을 사용하여 선을 그립니다. 싱글 톤을 언제 사용할 것인지 결정할 때 좋은 지침이 있습니까?
또한 누구나 디자인 패턴에 관한 좋은 책을 추천 할 수 있습니까?
기억해야 할 핵심은 디자인 패턴은 추상적 개념을 이해하는 데 도움이되는 도구 일뿐입니다. 일단 당신이 그 이해를 가지고 있다면, 책에서 "조리법"으로 당신 자신을 제한하는 것은 무의미하며, 목적에 가장 적합한 코드를 작성하는 능력에 상처를줍니다.
즉, GoF와 같은 책을 읽으면 문제에 대해 생각할 수있는 더 많은 방법을 제시 할 것이므로 시간을내어 무언가를 구현하면 문제에 접근 할 수있는 더 넓은 관점을 갖게 될 것입니다.
귀하의 경우, 싱글 톤을 사용하여 모든 경우에 의미가 있다면, 바로 앞에 가십시오. "일종의"종류의 제품이라면 그 제품을 다소 어색한 방식으로 구현해야합니다. 그런 다음 새로운 솔루션을 찾아야합니다. 완벽하지 않은 패턴을 강요하는 것은 원형 구멍에 사각형의 못을 치는 것과 같습니다.
"이 접근법은 효과적이었고 우리 상황에 매우 실용적이었습니다."라고 말하면 나는 잘하고 있다고 생각합니다.
다음은 좋은 책입니다.
네 권의 책- 고전적인 디자인 패턴의 책
헤드 퍼스트 디자인 패턴- 나는 이것을 대안으로 몇 사람들이 추천한다고 들었다.
예, 싱글 톤은 좋지 않습니다. 그들은 당신이하는 모든 일이 95 %의 시간에 나쁜 두 가지 속성을 결합하기 때문에 나쁜 것입니다. (이것은 평균적으로 싱글 톤은 시간의 99.75 %가 나쁘다는 것을 의미합니다)))
GoF가 정의한 싱글 톤은 다음과 같은 데이터 구조입니다.
첫 번째 것은 일반적으로 나쁜 것으로 간주됩니다. 우리는 전역을 좋아하지 않습니다. 두 번째는 좀 더 미묘하지만 일반적으로 이것이 합리적인 제한 인 경우는 거의 없습니다.억지로 시키다.
때로는 객체의 하나의 인스턴스 만 갖는 것이 타당합니다. 어떤 경우에는 하나만 만들도록 선택합니다. 그것을 시행하는 데 싱글 톤이 필요하지 않습니다.
그리고 보통 하나의 인스턴스만을 갖는 것이 "이해된다"고하더라도 대개 결국은 이해가되지 않습니다. 조만간에 하나 이상의 로거가 필요할 것입니다. 또는 하나 이상의 데이터베이스. 또는 각각의 단위 테스트에 대한 리소스를 다시 만들어야합니다. 즉, 원하는대로 단위 테스트를 만들 수 있어야합니다. 우리가 결과를 이해하기 전에 코드에서 유연성을 조기에 제거하고 있습니다.
싱글 톤은 의존성을 숨기고 결합을 증가시킵니다 (모든 클래스는 잠재적으로 싱글 톤에 의존 할 수 있습니다. 즉, 우리가 모든 싱글 톤을 재사용하지 않는 한 다른 프로젝트에서 클래스를 재사용 할 수 없음을 의미합니다.) 이러한 종속성은 함수 / 생성자 매개 변수 ), 우리는 그들을 알아 채지 못하며, 일반적으로 우리가 그것을 창조 할 때 생각하지 않습니다. 싱글 톤을 끌어 들이기가 너무 쉽습니다. 로컬 변수와 거의 모든 역할을합니다. 그래서 일단 거기에있게되면 많이 사용하는 경향이 있습니다. 그리고 그것은 그것들을 거의 제거하는 것을 거의 불가능하게 만듭니다. 아마도 스파게티 코드가 아닌 스파게티 의존성 그래프가 나타날 것입니다. 조만간 종속성은 싱글 톤이 서로에 따라 시작된다는 것을 의미하며, 초기화가 시도 될 때 순환 종속성을 얻습니다.
그들은 단위 테스트를 매우 어렵게 만듭니다. (싱글 톤 객체에서 함수를 호출하는 함수를 테스트하려면 어떻게해야합니까? 실제 싱글 톤 코드가 실행되는 것을 원하지 않지만 어떻게 방지 할 수 있습니까?
예, 싱글 톤은 좋지 않습니다.
때때로, 당신은 정말로 글로벌를 원합니다. 그런 다음 싱글 톤이 아닌 글로벌을 사용하십시오.
때로는 매우 드물게 클래스의 여러 인스턴스를 만드는 것이 오류 일 수 있습니다.양철통오류가 발생하지 않고 완료되지 않습니다. (내가 생각할 수있는 유일한 경우에 대해서만 고안된 것입니다. 하드웨어 장치를 대표 할 때입니다. 하나의 GPU 만 있으므로 코드의 객체에 매핑하면 하나의 인스턴스 만 존재할 수 있음을 의미합니다). 그러나 이러한 상황에서 자신을 발견하면 (여러 가지 인스턴스가 "하나 이상의 인스턴스에 대한 사용 사례를 생각할 수없는"심각한 상황이 아닌 심각한 오류를 일으키는 상황) 객체를 전역 적으로 표시하지 않고도 수행 할 수 있습니다.
이 두 가지 속성 각각양철통드문 경우이지만 유용 할 수 있습니다. 그러나 나는 하나의 사건을 생각할 수 없다.콤비네이션그들 중 좋은 것이 될 것입니다.
불행히도 많은 사람들이 "싱글 톤은 OOP 호환 전역입니다."라는 생각을 가지고 있습니다. 아니야, 그들은 그렇지 않아. 그들은 여전히 세계와 같은 문제를 겪고 있으며,게다가완전히 다른 무언가를 소개하는 것까지. 평범한 구식 세계에 비해 싱글 톤을 선호 할 이유는 전혀 없습니다.
소프트웨어 개발자는 이상적인 코딩 스타일을 선호하는지 실용적인 코딩 스타일을 선호하는지에 따라 꽤 균등하게 두 개의 캠프로 나뉘는 것처럼 보입니다.
개인적으로 나는 실용적인 접근 방식을 선호한다. 때로는 규칙을 어기는 것이 맞지만, 실제로하고있는 일을 실제로 이해하고 관련 위험을 기꺼이 받아들이는 경우에만 가능합니다. 특정 유스 케이스와 관련하여 아래 질문에 "예"라고 대답 할 수 있다면, 싱글 톤 패턴은 실질적인 이점을 얻을 수 있습니다.
unsafe
과goto
대다수의 경우에는 두 가지 모두 반핵 빈 (semi-frequent)으로 .NET 자체의 소스 코드에서 사용됩니다. 모든 옵션의 장단점을 알고 있지만 여전히 싱글 톤을 사용하기로 결정하면 완벽하게 정상적으로 작동합니다. - Abion47
싱글 톤은 프로그램을 죽이지 않고 프로그래머는 프로그램을 죽입니다.
어떤 프로그래밍 구조와 마찬가지로, 적절하게 사용될 때, 발에서 자신을 쏘지 않을 것입니다.
추천 도서는 괜찮지 만, 싱글 톤을 사용하도록 선택할 수있는 경험이있는 충분한 배경을 제공하지는 않습니다.
그 경험은 Singleton이 여러 인스턴스를 가질 필요가있을 때 Singleton이 나쁜 선택이라는 것을 알았을 때만 나타납니다. 갑자기 모든 곳에서 객체 참조를 주입하는 데 많은 어려움이 있습니다.
때로는 앞서 가서 객체 참조를 제자리에 두는 것이 더 좋지만, Singleton을 전혀 사용하지 않는다는 사실은 다른 디자인으로 리팩터링해야하는 경우 직면하게 될 문제의 범위를 식별하는 데 도움이됩니다. 제가 믿는 것은 아주 좋은 것입니다. 즉, 수업을 제대로하지 못하는 경우라도 수업에 변화의 효과를 볼 수있는 능력을 부여합니다.
우리는 기본적으로 같은 질문에 직면 해있는 프로젝트를 시작했습니다. 즉,모델에 액세스, 특히 루트 요소. 이 프로젝트는 플렉스 앱이 아니라 연극입니다! 웹 응용 프로그램,하지만 그건 중요하지 않습니다.
가있는단일 객체 고유시스템에 문제가 없습니다.그것을 액세스하는 방법. 따라서 싱글 톤에 대한 논쟁은의존성 주입(DI) 및 객체를 얻는 방법에 대해 설명합니다.
DI에 대한 주요 논거는 다음과 같습니다.
DI에 대한 가능한 접근법은 다음과 같습니다 (고전조파울러 출신) :
이 관점에서, 싱글 톤 패턴은 단지 서비스 로케이터의 일종이다.Model.getInstance()
.
그러나 미래의 변화에 직면 할 때 최대한의 유연성을 제공하기 위해서는 고유 한 객체에 대한 참조가 있어야합니다.돌아 다니다가능한 한 많이Model.getInstance()
필요할 때만. 이렇게하면 더 깔끔한 코드도 생성됩니다.
제 생각에는 싱글 톤 (Singleton)을 사용하면 디자인 결함을 직접 알 수 있습니다. 그 이유는 단순히 C ++에 내장 된 정상적인 객체 생성 및 파괴 메커니즘을 우회 할 수 있도록하기 위해서입니다. 객체가 다른 객체에 대한 참조를 필요로하는 경우, 객체는 작성시 객체에 대한 참조를 전달하거나 내부적으로 새 인스턴스를 생성해야합니다. 그러나 싱글 톤을 사용하면 생성 및 해체 사이클을 명백하게 모호하게 만듭니다. 관련 문제는 싱글 톤의 수명을 제어하는 것이 극히 어렵다는 것입니다. 결과적으로 일반 싱글 톤 구현을 포함하는 많은 패키지에는 clunky object lifetime manager 등이 포함됩니다. 때로는 이들이 싱글 톤을 관리하기 위해 존재하지 않는지 궁금합니다.
기본적으로 여러 위치에서 객체를 사용해야하는 경우 스택의 가장 높은 공통점에서 명시 적으로 만들어야하며 객체를 사용하는 모든 사용자에게 참조를 통해 전달되어야합니다. 때때로 사람들은 새로운 스레드에 여러 arg를 전달하는 데 문제가 있기 때문에 Singleton을 사용하지만이 경우에는 떨어지지 않고 명시 적으로 스레드 args를 정의한 다음 같은 방식으로 새 스레드에 전달합니다. 프로그램이 훨씬 더 깨끗하게 흐르고 정적 초기화 종속성 또는 잘못된 분해로 인한 불쾌한 놀라움이 없다는 것을 알 수 있습니다.
싱글 톤은 당연히 나쁘지 않습니다. 그들은 용도가 좋으며, 그중 일부는 아주 좋습니다. 싱글 톤은 경험이 부족한 개발자가 종종 배우는 첫 번째 디자인 패턴이기 때문에 남용되는 경향이 있으며 매우 간단하므로 그 의미에 대해 생각하지 않고 모든 곳에서 사용합니다.
싱글 톤을 사용하고 싶을 때마다 왜이 패턴을 사용하는지, 그리고이 패턴을 사용할 때의 이점과 부정적인 점을 고려하십시오.
싱글 톤은 효과적으로 '물건'(데이터 또는 메소드)의 전역 액세스 가능한 세트를 만들지 만 대부분의 사람들은 너무 많은 전역 변수를 사용하는 것이 좋은 아이디어는 아니라고 생각합니다. 클래스와 객체 지향의 모든 요점은 모든 것을 하나의 거대한 글로벌 공간에 집어 넣는 것보다 개별적인 영역으로 그룹화하는 것입니다.
싱글 톤보다 선호하는 경향이있는 '패턴'중 하나는 필요한 객체를 맨 위에서 아래로 전달하는 것입니다. 내 앱 초기화 단계에서 한 번 만들었고 액세스가 필요한 모든 개체를 통과시킵니다. 싱글 톤 패턴의 '단일 생성'부분을 모방하지만 '글로벌'부분은 없습니다.
싱글 톤의 핵심은 오직 1 개만 존재해야하는 객체를위한 것입니다. 당신은 클래스의 데이터 컨트롤 집합을 언급했다. 어쩌면 실제로, 앱이 2 세트의 데이터 컨트롤 클래스를 생성하기를 원할지도 모르는 상황이 있기 때문에 아마도 이것에 싱글 톤 (singleton)을 적용하는 것이 옳지 않다고 생각할 수도 있습니다. 대신, 당신이 app init에이 데이터 클래스를 생성하고 전달하면, 현재의 앱이 필요로하는 것과 같이 1 세트 만 생성하게 될 것이지만, 어떤 시점에서 두번째 세트가 필요하다면 가능성을 열어 두어야합니다 당신은 쉽게 그들을 만들 수 있습니다. 또한 데이터 컨트롤 클래스는 앱의 어디에서나 액세스 할 수있는 전역 변수가되어야합니다. 내 생각 엔 대신 하위 수준의 데이터 액세스 레이어에서만 액세스 할 수 있어야합니다.
어떤 사람들은 GOF 서적을 추천했습니다. 나는 훌륭한 책이지만, 먼저 일반적인 아키텍처에 관한 책을 먼저 찾아보고, 2 / 3 / n- 티어 디자인, 캡슐화, 추상화 및 이러한 종류의 원칙을 먼저 읽으려고합니다. 이것은 GOF가 말하는 패턴의 적절한 사용법을 이해할 수있는 좀 더 견고한 기반을 제공 할 것입니다.
[편집 : 싱글 톤 변형이 유용 할 수있는 다른 시간은 단일 액세스 포인트를 원할 때이지만 구현 세부 사항은 실제로 둘 이상이 될 수 있습니다. 호출자는 커버 아래에서 싱글 톤 객체에 대한 요청이 실제로 사용 가능한 여러 객체에 대해 처리되고 하나가 반환된다는 것을 알 필요가 없습니다. 나는 쓰레드 풀 같은 것을 생각하고 있는데, 사용법이 어디로가는 지, 헤이, 그냥 쓰레드를 얻는다. 1이 필요하지만, 나는 상관 없다.]
나는 이것이 오래된 쓰레드라는 것을 알고 있지만 아무도 OP가하려고했던 것과 맞는 실제 패턴을 언급하지 않았다. 그가 내가 필요하다고 생각하는 것은중재자 패턴. SourceMaking은 이러한 종류의 정보를 배우고 참조하기위한 환상적인 사이트입니다. 소프트웨어 패턴에 사람들을 소개하기위한 장소로 확실히 가고 있습니다. 또한, 일반적으로 어떤 디자인 패턴이 필연적으로 본질적으로 좋거나 나쁘다는 개념에 사지 않는 것이 좋습니다. 그들 모두는 그들의 사용법을 가지고 있으며, 그것들을 언제 어디에서 사용 하는지를 배우는 것이 트릭입니다. 나에게 싱글 톤을 사용하지 말라고 말하는 사람들은 그들의 유용성을 이해하지 못합니다.
싱글 톤은 "나쁘지 않다". 관련 싱글 톤이 많고 팩토리를 사용하여 많은 수의 팩을 대체 / 통합 할 수 있지만 걱정하지 않아도되므로 그럴 때가 있습니다.
책에 관해서는,글쎄, 일종의 캐논이있어..
Google은납득시키다그 싱글 톤은 나쁜 생각입니다.
Google이하는 모든 일이 완벽하거나 모든 의견이 논점의 끝이라고 제안하는 것은 아닙니다. 그러나이 Singleton 탐지기를 사용하여이 문제를 해결할 수 있습니다. 너 자신의 생각을해라.