불변 / 상태 비 저장 싱글 톤이 불량합니까?


12

최근에 싱글 톤에 대해 어떤 종류의 혁명이 있었지만, 무국적이라면 그들에게 어떤 문제가 있습니까?

나는 남용 이야기와 모든 것을 알고 있습니다 ... 이것은 싱글 톤뿐만 아니라 모든 것에 적용됩니다.


1
아닙니다. 싱글 톤은 원칙적으로 나쁘지 않고 단지 지나치게 과도하게 사용됩니다.
Bart van Ingen Schenau

3
최근에 무엇을 의미합니까?
Manoj R

5
@Joachim Sauer : 왜 교체해야합니까? 상태가없는 경우에는이를 직접 테스트 할 수 있습니다.
m3th0dman

1
상태 비 저장 싱글 톤을 사용하는 경우 기본적으로 정적 유틸리티 클래스가 있으며이 클래스는 신 클래스 반 패턴으로 성장하는 경향이 있습니다. 일반적으로 사용되는 컨텍스트에서 정적 메서드를 대신 사용할 수 있습니다 (또는 C #에서 확장 메서드 사용).
Spoike

답변:


12
  > Are immutable/stateless singletons bad?
  • 다른 외부 시스템에 의존하지 않는 경우 아니요 .
    • 예 : 문자열 내에서 html을 이스케이프 처리하는 Stringutility
    • 이유 : 단위 테스트에서는 이것을 모의 / 시뮬레이터로 대체 할 필요가 없습니다.
  • 당신의 불변 /의 무 싱글은 다른 외부 시스템 / 서비스에 의존하고 유닛 테스트 수행하려는 경우 (절연에 테스트) 경우
    • 예 : 외부 세금 계산기 웹 서비스에 의존하는 서비스.
    • 이유 :이 서비스로 단위 테스트를 수행하려면 (외부 적으로) 외부 시스템 / 서비스를 시뮬레이션 / 모의해야합니다.

자세한 내용은 양파 아키텍처를 참조하십시오 .


  • 싱글 톤을 사용하면 단위 테스트 (단독)를 더 어렵게 / 불가능하게 만들 수 있습니다.
  • 숨겨진 의존성 / 커플 링은 @yBee가 설명하는 문제로 볼 수 있습니다.

싱글 톤을 사용하지 않는 다른 이유는 없습니다.


클래스가 (상태 비 저장) 싱글 톤이 아니더라도 클래스를 테스트하려면 여전히 외부 웹 서비스를 조롱해야합니다.
m3th0dman

@ m3th0dman 동의합니다
k3b

10

항상 사용법에 따라 다릅니다. 나는 혁명이 모든 프로그래머가 같은이 패턴 학습 있다는 사실에서 오는 생각 객체 지향 패턴을. 대부분 그것이 의미가있는 곳과 그렇지 않은 곳에 대해 생각하는 것을 잊어 버리십시오. 물론 이것은 모든 패턴에 적용됩니다. 패턴을 사용하는 것만으로는 좋은 코드 나 좋은 소프트웨어를 만들 수 없습니다.

상태 비 저장 싱글 톤이있는 경우 정적 메소드 만 제공하는 클래스를 사용하거나 정적 클래스를 사용하지 않는 이유는 무엇입니까?

다음 은 일반적으로 전역 변수와 싱글 톤에 관한 게시물입니다.

저자만큼 엄격하지는 않지만 싱글 톤이 필요하다고 생각하는 대부분의 경우 실제로 필요하지 않다는 것을 보여줍니다.


1
정적 메소드가있는 클래스를 사용하지 않는 이유는 무엇입니까? 예를 들어 상속 ...
m3th0dman

3
@ m3th0dman : 상속을위한 좋은 장소처럼 들리지 않습니다.
Billy ONeal

@BillyONeal 당신은 도메인 모델을 알고 있다면, 상속을 위해 무언가가 좋거나 나쁘다고 말할 수있다.
m3th0dman

2
@ m3th0dman : 음, 아니. 도메인 모델에 대해 전혀 몰라도 꽤 긍정적일 수 있습니다. 상속은 다형성 동작을위한 것입니다. 그러나 싱글 톤으로는 다형성 동작이 없습니다.
Billy ONeal

1
@ m3th0dman : 싱글 톤 객체를 얻으려면 호출 사이트에서 싱글 톤의 이름을 지정해야합니다. 이는 다형성 동작을 사용하지 않음을 의미합니다. 이는 컴포지션이 상속보다 훨씬 유연하다는 것을 의미합니다.
Billy ONeal

7

정적 클래스가 할 수없는 불변 상태 비 저장 싱글 톤이 할 수있는 일은 없습니다.

정적 메소드에 대한 일반 호출이 자원 측면에서 더 명확하고 보수적이며 아마도 더 빠를 것이지만,-> Instance ()가 생성하는 추가 수준의 복잡성을 추가 할 이유는 없습니다.

그들이 틀린 것은 아닙니다. 더 좋은 방법이 있습니다. 정상 ( "상태 저장") 싱글 톤이 올바른 방법 인 시나리오가 있습니다. 싱글 톤의 악은 글로벌 변수와 동일한 나쁜 결과로 종종 악용되지만 싱글 톤을 사용하는 것이 정확한 경우가 있습니다. 무국적자에게는 그러한 사례가 없습니다.


Singleton에 몇 가지 장점이있는 경우를 구성 할 수 있습니다. 시나리오 및 프로그래밍 언어에 따라 (예 : 지연로드 활용).
StampedeXV

1
@StampedeXV : 예, 확실히 상태 저장 싱글 톤입니다. 무국적이며 불변의 것-나는 어떤 예를 들어 정말로 호기심이 있지만 숨을 멈추지 않습니다.
SF.

좋아, 당신은 요점이 있습니다. 나는 당신의 대답을 약간 거기에서 일반화했습니다. 불변 상태 비 저장의 경우 어떤 이점도 보지 못합니다.
StampedeXV

1
정적 함수 만있는 클래스에서는 상속 / 다형성을 사용할 수 없습니다.
m3th0dman

1
정적 클래스가 할 수없는 불변 상태 비 저장 싱글 톤이 할 수있는 일은 없습니다. 정적 메소드는 싱글 톤이 할 수있는 인터페이스를 구현할 수 없습니다.
Michal M

3

싱글 톤의 주요 문제점은 교차 절단 문제 시나리오에서 사용될 때 의존성과 커플 링을 숨기는 것입니다. 싱글 톤이 병적 거짓말 쟁이 이거나 싱글 톤이 악한 이유를 참조하십시오 .

반면에 싱글 톤이 적은 상태는 남용되지 않으면 도움이되고 성능을 향상시킬 수 있습니다. 예를 보자.

interface Interface
{
    void Method();
}

class StatelessSingleton : Interface
{
    public static readonly StatelessSingleton Instance = new StatelessSingleton();
    private StatelessSingleton() { }

    public void Method() { }
}

class User
{
    public User(Interface i) { /* ... */ }
}

여기서 StatelessSingleton은 인터페이스의 기본 구현 역할을하며 사용자 생성자에 배치됩니다. 하드 코딩 된 커플 링과 숨겨진 종속성이 없습니다. 기본 인터페이스로 인해 정적 클래스를 사용할 수 없지만 기본 인스턴스를 두 개 이상 만들 이유는 없습니다. 이것이 무국적 싱글 톤이 적절한 선택 인 것 같습니다.

그러나 기본 구현에 다른 패턴을 사용해야 할 수도 있습니다.

class Implementation : Interface
{
    private readonly Action _method;

    public Implementation()
    {
        _method = new Action(() => { /* default */ });
    }

    public Implementation(Action custom)
    {
        _method = custom;
    }

    public void Method()
    {
        _method();
    }
}

StatelessSingleton과 관련하여 성능에 영향을 주지만 인터페이스의 일반적인 구현을 구성합니다. IProgress 인터페이스 에서도 비슷한 솔루션이 사용됩니다 .

다시 한번, 왜 기본 행동의 둘 이상의 구현을 만들 수 있습니까? 그러나 우리는 두 가지를 결합 할 수 있습니다 :

class Implementation : Interface
{
    public readonly Implementation Default = new Implementation();

    private readonly Action _method;

    private Implementation()
    {
        _method = new Action(() => { /* default */ });
    }

    public Implementation(Action custom)
    {
        _method = custom;
    }

    public void Method()
    {
        _method();
    }
}

결론적으로, 나는 싱글 톤이 유용한 곳 (기본값으로 묘사 된 곳)이 있다고 생각합니다. Singleton의 주요 정의에 따르면 클래스의 인스턴스두 개 이상 만들 수 없습니다 . 원자력과 같습니다. 에너지 나 폭탄을 생산할 수 있습니다. 그것은 인간에 달려 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.