문제

많은 사람들이 싱글 톤 패턴에 많은 단점이 있고 일부는 패턴을 완전히 피할 것을 제안한다는 데 동의하는 것 같습니다. 있습니다 여기에서 훌륭한 토론. 싱글 톤 패턴에 대한 의견을 해당 질문에 지시하십시오.

내 질문: 다른 디자인 패턴이 있습니까?

도움이 되었습니까?

해결책

패턴은 복잡합니다

모든 설계 패턴은주의해서 사용해야합니다. 제 생각에는 패턴을 향해 리팩터링해야합니다 패턴을 즉시 구현하는 대신 그렇게해야 할 유효한 이유가있는 경우. 패턴 사용의 일반적인 문제는 복잡성을 더하는 것입니다. 패턴의 과도한 사용은 주어진 응용 프로그램 또는 시스템을 더욱 발전하고 유지하기 위해 번거롭게 만듭니다.

대부분의 경우 간단한 솔루션이 있으며 특정 패턴을 적용 할 필요가 없습니다. 좋은 규칙은 코드 조각을 교체하거나 자주 변경해야 할 때마다 패턴을 사용하고 패턴을 사용할 때 복잡한 코드의 경고를 받도록 준비하는 것입니다.

기억 당신의 목표는 단순성이어야합니다 코드의 변화를 지원해야 할 필요가있는 경우 패턴을 사용하십시오.

패턴에 대한 원리

분명히 과도하게 엔지니어링되고 복잡한 솔루션으로 이어질 수 있다면 패턴을 사용하는 것은 무의미한 것처럼 보일 수 있습니다. 그러나 프로그래머가 읽는 것이 훨씬 더 흥미 롭습니다. 설계 기술과 원리 그것은 대부분의 패턴의 기초를 마련합니다. 사실 내 중 하나 '디자인 패턴'에 대한 좋아하는 책은 이것을 강조합니다 해당 패턴에 어떤 원칙이 적용되는지 반복함으로써. 관련성 측면에서 패턴보다 유용 할 정도로 간단합니다. 일부 원칙은 다음과 같은 객체 지향 프로그래밍 (OOP) 이상을 포괄 할 수있을 정도로 일반적입니다. Liskov 대체 원리, 코드 모듈을 빌드 할 수있는 한.

다양한 디자인 원칙이 있지만 GOF 책의 첫 장 시작하는 데 매우 유용합니다.

  • '구현'이 아닌 '인터페이스'로 프로그램. (1995 년 4 월 4 일 : 18)
  • '개체 구성'오버 '클래스 상속'을 선호합니다. (1995 년 4 월 4 일 : 20)

잠시 동안 당신에게 가라 앉게하십시오. GOF가 작성되었을 때 상호 작용 Java 또는 C#유형으로 인터페이스와 혼동되지 않도록 추상화 (슈퍼 클래스를 의미하는)를 의미합니다. 두 번째 원칙은 관찰 된 상속의 남용에서 비롯됩니다. 슬프게도 오늘날에도 여전히 흔합니다.

거기에서 당신은 읽을 수 있습니다 견고한 원칙 Robert Cecil Martin이 알고 있습니다 (일명 밥 삼촌). Scott Hanselman은 밥 삼촌을 인터뷰했습니다 이 원칙에 대한 팟 캐스트:

  • 에스책임 원리
  • 영형펜 닫는 원리
  • ISKOV 대체 원리
  • nterface 분리 원리
  • ependency 반전 원리

이 원칙들은 읽고 동료들과 토론하기위한 좋은 시작입니다. 원칙이 서로와 다음과 같은 다른 프로세스와 얽혀 있음을 알 수 있습니다. 우려의 분리 그리고 의존성 주입. 한 후 TDD 잠시 동안 당신은 또한이 원칙들이 실제로 자연스럽게 나오는 것을 알 수 있습니다. 외딴 그리고 반복 가능 단위 테스트.

다른 팁

디자인 패턴의 저자가 가장 걱정하는 것은 "방문자"패턴이었습니다.

그것은 "필요한 악"이지만 종종 과도하게 사용되며 그 필요성은 종종 디자인에서 더 근본적인 결함을 드러냅니다.

"방문자"패턴의 대체 이름은 "Multi-Dispatch"입니다. 방문자 패턴은 단일 유형 디스패치 OO 언어를 사용하여 2 가지 유형을 기준으로 사용할 코드를 선택할 때 끝나는 것입니다. (또는 그 이상) 다른 물체.

전형적인 예는 두 가지 모양 사이에 교차점이 있지만 종종 간과되는 더 간단한 사례가 있습니다. 두 가지 이종 객체의 평등을 비교합니다.

어쨌든, 종종 당신은 다음과 같은 것으로 끝납니다.

interface IShape
{
    double intersectWith(Triangle t);
    double intersectWith(Rectangle r);
    double intersectWith(Circle c);
}

이것의 문제점은 "ishape"의 모든 구현을 결합했다는 것입니다. 계층에 새로운 모양을 추가하려면 다른 모든 "모양"구현도 변경해야한다는 것을 암시했습니다.

때로는 이것이 올바른 최소 디자인이지만 생각해보십시오. 당신의 디자인을 수행합니다 진짜 두 가지 유형으로 파견해야 할 의무가 있습니까? 다중 방법의 조합 폭발 각각을 기꺼이 작성 하시겠습니까?

종종 다른 개념을 도입하면 실제로 작성해야 할 조합 수를 줄일 수 있습니다.

interface IShape
{
    Area getArea();
}

class Area
{
    public double intersectWith(Area otherArea);
    ...
}

물론, 그것은 때로는 다른 모든 경우를 처리하기 위해 코드를 작성해야합니다. 그러나 멈추고 방문자를 사용하기 전에 잠시 멈추고 생각할 가치가 있습니다. 나중에 많은 고통을 구할 수 있습니다.

싱글 톤 - 싱글 톤 X를 사용하는 클래스는 볼 수없고 테스트를 위해 분리하기 어려운 이에 대한 의존성을 가지고 있습니다.

편리하고 이해하기 쉽기 때문에 매우 자주 사용되지만 실제로 테스트를 복잡하게 할 수 있습니다.

보다 싱글 톤은 병리학 적 거짓말 쟁이입니다.

템플릿 방법 패턴은 일반적으로 매우 위험한 패턴이라고 생각합니다.

  • "잘못된 이유"에 대해 상속 계층을 사용합니다.
  • 기본 클래스는 모든 종류의 발전되지 않은 코드로 흩어지는 경향이 있습니다.
  • 그것은 당신이 개발 과정에서 초기에 디자인을 잠그도록 강요합니다. (많은 경우에 조기 고정)
  • 이후 단계에서 이것을 바꾸는 것은 더 어려워지고 어려워집니다.

디자인 패턴 (DP)을 피해야한다고 생각하지 않으며, 아키텍처를 계획 할 때 DPS를 사용하도록 강요해야한다고 생각하지 않습니다. 우리는 DP가 계획에서 자연스럽게 나타날 때만 사용해야합니다.

처음부터 주어진 DP를 사용하고 싶다고 정의하면, 우리가 선택한 DP가 우리의 요구에 적합하다는 보장없이 미래의 많은 디자인 결정이 그 선택에 영향을 줄 것입니다.

우리가하지 말아야 할 한 가지는 DP를 불변의 실체로 취급하는 것입니다. 우리는 패턴을 필요에 맞게 조정해야합니다.

따라서 Sumarizing은 DPS를 피해야한다고 생각하지 않습니다. DPS가 이미 건축 상태에서 구체화 될 때 수용해야합니다.

Active Record는 비즈니스 논리를 영구 코드와 혼합하는 과도한 패턴이라고 생각합니다. 모델 레이어에서 스토리지 구현을 숨기는 데는 잘 작동하지 않으며 모델을 데이터베이스에 연결합니다. Table Data Gateway, Row Data Gateway 및 Data Mapper와 같은 많은 대안 (POEAA에 설명)이있어 종종 더 나은 솔루션을 제공하고 스토리지에 대한 더 나은 추상화를 제공하는 데 도움이됩니다. 또한 귀하의 모델은해서는 안됩니다 필요 데이터베이스에 저장됩니다. XML로 저장하거나 웹 서비스를 사용하여 액세스하는 것은 어떻습니까? 모델의 스토리지 메커니즘을 변경하는 것이 얼마나 쉬운가요?

즉, Active Record가 항상 나쁘지는 않으며 다른 옵션이 과잉이되는 더 간단한 응용 프로그램에 적합합니다.

간단합니다 ... 디자인 패턴을 피하십시오 명확하지 않습니다 당신이나 그 사람들에게 당신은 편안하지 않습니다.

일부 이름을 ...

일부가 있습니다 불행한 패턴, 예 : 예 :

  • Interpreter
  • Flyweight

일부도 있습니다 이해하기가 더 어렵습니다, 예 : 예 :

  • Abstract Factory - 생성 된 물체의 패밀리가있는 완전 추상 공장 패턴은
  • Bridge - 추상화와 구현이 하위 트리로 나뉘어지면 너무 추상적이지만 경우에 따라 매우 유용한 패턴입니다.
  • Visitor - 이중 파견 메커니즘 이해는 실제로 필수입니다

그리고 그 패턴이 있습니다 굉장히 간단 해 보입니다, 하지만 그렇게 명확한 선택은 아닙니다 원칙이나 구현과 관련된 여러 가지 이유로 인해 :

  • Singleton - 완전히 나쁜 패턴이 아니고 너무 많이 사용됩니다 (종종 적합하지 않은 곳)
  • Observer - 훌륭한 패턴 ... 단지 코드를 읽고 디버깅하기가 훨씬 어렵게 만듭니다.
  • Prototype - 컴파일러 검사를 거래하는 역동적 인 거래 (좋든 나쁘 든 ...에 따라 다름)
  • Chain of responsibility - 너무 자주 단지 디자인으로 인위적으로 밀려났습니다.

그 "비영리적인 것들"의 경우, 어딘가에 더 우아한 솔루션이 있기 때문에 사용하기 전에 실제로 생각해야합니다.

"파악하기가 더 어렵다"는 ... 그들은 적절한 장소에서 사용될 때와 잘 구현 될 때 정말 큰 도움이되지만, 부적절하게 사용될 때 악몽입니다.

이제 다음은 ...

나는 이것에 대해 너무 많이 구타 당하지 않기를 바랍니다. Christer Ericsson은 두 기사를 썼습니다.하나, ) 그의 디자인 패턴 주제에 실시간 충돌 감지 블로그. 그의 어조는 다소 가혹하고 아마도 약간 도발적이지만, 그 사람은 그의 물건을 알고 있으므로 나는 그것을 미치광이의 열망으로 무시하지 않을 것입니다.

어떤 사람들은 그렇게 말합니다 서비스 로케이터 반 패턴입니다.

나는 관찰자 패턴이 대답해야 할 것이 많다고 생각합니다. 매우 일반적인 경우에는 효과가 있지만 시스템이 더 복잡해지면서 (), onfter () 알림이 필요하며 종종 비동기 작업이 필요합니다. 엔트 런치. 훨씬 더 나은 솔루션은 계산 중에 모든 객체 액세스 (읽기 장벽 포함)를 계산하고 종속성 그래프에서 에지를 자동으로 생성하는 자동 종속성 분석 시스템을 개발하는 것입니다.

Spoike의 게시물에 대한 보완, 패턴에 대한 리팩토링 좋은 읽기입니다.

반복자는 피할 수있는 하나의 GOF 패턴이거나 적어도 대안을 사용할 수없는 경우에만 사용하는 것이 하나 더 있습니다.

대안은 다음과 같습니다.

  1. 각각의 루프. 이 구성은 대부분의 주류 언어로 존재하며 대부분의 경우 반복자를 피하는 데 사용될 수 있습니다.

  2. 선택기 à la linq 또는 jQuery. 컨테이너의 모든 물체가 처리되어서는 안되기 때문에, 시작이 적절하지 않을 때 사용해야합니다. 반복자와 달리 선택기는 한 곳에서 어떤 종류의 종류를 처리 할 것인지 나타낼 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top