최근에 싱글 톤에 대해 어떤 종류의 혁명이 있었지만, 무국적이라면 그들에게 어떤 문제가 있습니까?
나는 남용 이야기와 모든 것을 알고 있습니다 ... 이것은 싱글 톤뿐만 아니라 모든 것에 적용됩니다.
최근에 싱글 톤에 대해 어떤 종류의 혁명이 있었지만, 무국적이라면 그들에게 어떤 문제가 있습니까?
나는 남용 이야기와 모든 것을 알고 있습니다 ... 이것은 싱글 톤뿐만 아니라 모든 것에 적용됩니다.
답변:
> Are immutable/stateless singletons bad?
싱글 톤을 사용하지 않는 다른 이유는 없습니다.
항상 사용법에 따라 다릅니다. 나는 혁명이 모든 프로그래머가 같은이 패턴 학습 있다는 사실에서 오는 생각 객체 지향 패턴을. 대부분 그것이 의미가있는 곳과 그렇지 않은 곳에 대해 생각하는 것을 잊어 버리십시오.
물론 이것은 모든 패턴에 적용됩니다. 패턴을 사용하는 것만으로는 좋은 코드 나 좋은 소프트웨어를 만들 수 없습니다.
상태 비 저장 싱글 톤이있는 경우 정적 메소드 만 제공하는 클래스를 사용하거나 정적 클래스를 사용하지 않는 이유는 무엇입니까?
다음 은 일반적으로 전역 변수와 싱글 톤에 관한 게시물입니다.
저자만큼 엄격하지는 않지만 싱글 톤이 필요하다고 생각하는 대부분의 경우 실제로 필요하지 않다는 것을 보여줍니다.
정적 클래스가 할 수없는 불변 상태 비 저장 싱글 톤이 할 수있는 일은 없습니다.
정적 메소드에 대한 일반 호출이 자원 측면에서 더 명확하고 보수적이며 아마도 더 빠를 것이지만,-> Instance ()가 생성하는 추가 수준의 복잡성을 추가 할 이유는 없습니다.
그들이 틀린 것은 아닙니다. 더 좋은 방법이 있습니다. 정상 ( "상태 저장") 싱글 톤이 올바른 방법 인 시나리오가 있습니다. 싱글 톤의 악은 글로벌 변수와 동일한 나쁜 결과로 종종 악용되지만 싱글 톤을 사용하는 것이 정확한 경우가 있습니다. 무국적자에게는 그러한 사례가 없습니다.
싱글 톤의 주요 문제점은 교차 절단 문제 시나리오에서 사용될 때 의존성과 커플 링을 숨기는 것입니다. 싱글 톤이 병적 거짓말 쟁이 이거나 싱글 톤이 악한 이유를 참조하십시오 .
반면에 싱글 톤이 적은 상태는 남용되지 않으면 도움이되고 성능을 향상시킬 수 있습니다. 예를 보자.
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의 주요 정의에 따르면 클래스의 인스턴스 를 두 개 이상 만들 수 없습니다 . 원자력과 같습니다. 에너지 나 폭탄을 생산할 수 있습니다. 그것은 인간에 달려 있습니다.