설계 패턴
Design Patterns![]() | 이 문서는 Wikipedia의 레이아웃 가이드라인에 따라 재편성이 필요할 수 있습니다.(2013년 7월 (이 및 ) |
![]() | |
작가. | 4인조: |
---|---|
나라 | 미국 |
주제 | 설계 패턴, 소프트웨어 엔지니어링, 객체 지향 프로그래밍 |
출판인 | 애디슨 웨슬리 |
발행일자 | 1994 |
페이지 | 395 |
ISBN | 0-201-63361-2 |
OCLC | 31171684 |
005.1/2 20 | |
LC Class | QA76.64.D47 1995 |
설계 패턴: 재사용 가능한 객체 지향 소프트웨어의 요소(1994)는 소프트웨어 설계 패턴을 설명하는 소프트웨어 엔지니어링 서적입니다.이 책은 Erich Gamma, Richard Helm, Ralph Johnson, 그리고 John Vlissides에 의해 쓰여졌고, Grady Boch가 서문을 썼다.이 책은 두 부분으로 나뉘어져 있으며, 처음 두 장은 객체 지향 프로그래밍의 기능과 함정을 탐색하고 나머지 두 장은 23개의 고전 소프트웨어 설계 패턴을 설명합니다.이 책에는 C++와 Smalltalk의 예가 포함되어 있다.
소프트웨어 엔지니어링 분야에 영향을 미쳐 왔으며 객체 지향 설계 이론과 실천의 중요한 원천으로 간주되고 있습니다.50만[citation needed] 부 이상이 영어나 13개 언어로 판매되었다.저자들은 종종 Gang of Four (GoF)[1]라고 불린다.
역사
이 책은 Erich Gamma와 Richard Helm이 만나 공통의 관심사를 발견한 Bruce Anderson이 운영하는 OOPSLA '90의 "건축 핸드북을 향해"에서 시작되었다.그들은 나중에 랄프 존슨과 존 블리시데스에 [2]의해 합류했다.이 책의 원래 출판일은 1994년 10월 21일이었고, 1995년 저작권을 가지고 있었기 때문에 1994년에 출판되었음에도 불구하고 종종 1995년으로 인용된다.이 책은 1994년 10월 오리건 주 포틀랜드에서 열린 OOPSLA 회의에서 처음으로 일반에 공개되었다.2005년 ACM SIGPLAN은 프로그래밍 연습과 프로그래밍 언어 [3]설계에 대한 저자의 영향을 인정받아 그 해의 프로그래밍 언어 공로상을 수상했습니다.2012년 3월 현재 이 책은 40쇄를 발행하고 있다.
서론
![]() | 이 섹션에는 특정 청중만 관심을 가질 수 있는 지나치게 복잡한 세부 정보가 포함될 수 있습니다.. (2020년 10월 (이 메시지 및 ) 또는 하여 Wikipedia의 정책에 수 한 세부 하십시오 |
제1장에서는 저자의 경험에 기초한 객체 지향 설계 기법에 대해 설명합니다.저자들은 이를 통해 다음과 같은 객체 지향 소프트웨어 설계가 향상될 것이라고 생각합니다.
저자들은 구현에 비해 인터페이스가 갖는 장점으로서 다음과 같은 것을 주장합니다.
- 오브젝트가 인터페이스에 준거하고 있는 한, 클라이언트는 사용하는 오브젝트의 특정 타입을 인식하지 않습니다.
- 클라이언트는 이러한 오브젝트를 실장하는 클래스를 인식하지 않습니다.클라이언트는 인터페이스를 정의하는 추상 클래스만 알고 있습니다.
인터페이스를 사용하면 객체 지향 프로그래밍의 중심 특징인 동적 바인딩과 다형성도 발생합니다.
작성자는 상속을 화이트박스 재사용이라고 부르고 화이트박스는 가시성을 나타냅니다.이는 부모 클래스의 내부가 하위 클래스에 표시되는 경우가 많기 때문입니다.이와는 대조적으로, 작성자들은 객체 구성(명확한 인터페이스를 가진 객체가 다른 객체에 대한 참조를 얻는 객체에 의해 런타임에 동적으로 사용되는 것)을 블랙박스 재사용으로 언급하는데, 이는 그것들을 사용하는 코드에서 합성 객체의 내부 세부사항을 볼 필요가 없기 때문이다.
저자들은 상속과 캡슐화 사이의 긴장에 대해 상세히 논의하고, 그들의 경험상 설계자들이 상속을 과도하게 사용한다고 진술한다(Gang of Four 1995:20).위험은 다음과 같이 명시됩니다.
- "상속은 하위 클래스를 상위 구현의 세부 사항에 노출하기 때문에, 흔히 '상속은 캡슐화를 파괴한다'고 합니다." (Gang of 4 1995:19)
이들은 하위 클래스의 구현이 상위 클래스의 구현과 너무 밀접하게 얽혀 있을 수 있으므로 상위 클래스의 구현 변경은 하위 클래스를 강제로 변경할 것이라고 경고한다.또한 이를 피하는 방법은 추상 클래스에서만 상속하는 것이라고 주장하지만 코드 재사용이 최소화된다는 점을 지적합니다.
상속을 사용하는 것은 주로 기존 컴포넌트의 기능에 추가하거나 이전 코드를 대부분 재사용하거나 비교적 적은 양의 새 코드를 추가할 때 권장됩니다.
저자에게 '위임'은 상속을 대체하기 위해 항상 사용될 수 있는 극단적인 형태의 객체 구성이다.위임에는 2개의 오브젝트가 포함됩니다.즉, '송신자'는 자신을 '위임자'에게 전달하여 위임자가 발신자를 참조할 수 있도록 합니다.따라서 시스템의 두 부분 사이의 링크는 컴파일 시간이 아닌 런타임에만 확립됩니다.위임에 대한 자세한 내용은 Callback 기사를 참조하십시오.
또한 저자들은 제네릭(Ada, Eiffel, Java, C#, VB)이라고도 하는 이른바 파라미터화 유형에 대해서도 설명합니다.NET, 및 델파이) 또는 템플릿(C++).이를 통해 사용하는 다른 모든 유형을 지정하지 않고도 모든 유형을 정의할 수 있습니다. 지정되지 않은 유형은 사용 시점에 '파라미터'로 제공됩니다.
저자들은 위임과 매개 변수화가 매우 강력하다는 것을 인정하지만 다음과 같은 경고를 덧붙입니다.
- 「동적이고 파라메타화된 소프트웨어는, 스태틱한 소프트웨어보다 이해와 구축이 어렵습니다」(Gang of Four 1995:21)
저자들은 한 개체가 다른 개체의 '일부' 또는 '일부'인 '집합'과 한 개체가 다른 개체의 '알고 있는' 지인(집합된 개체와 소유자의 수명이 동일함을 암시함)을 추가로 구분한다.때때로 지인을 '연관' 또는 '사용' 관계라고 부른다.지인 오브젝트는 서로 조작을 요구할 수 있지만 서로 책임을 지지 않습니다.지인관계는집약관계보다약하고객체간의커플링이더느슨하다는것을제시합니다.이러한커플링은설계에서유지보수를최대한하기위해필요할수도있습니다.
저자들은 C#이나 Java에서와 같이 오늘날 다른 사람들이 '클래스 라이브러리'를 사용할 수 있는 '툴킷'이라는 용어를 사용한다.용어로는 툴킷은 서브루틴 라이브러리의 객체 지향적 등가물인 반면, '프레임워크'는 특정 소프트웨어 클래스의 재사용 가능한 설계를 구성하는 협력 클래스의 집합이다.이들은 애플리케이션을 설계하기가 어렵고 툴킷이 더 어려우며 프레임워크가 설계하기가 가장 어렵다고 말합니다.
유형별 패턴
크레셔널
크레이셔널 패턴은 객체를 직접 인스턴스화할 필요가 없이 객체를 생성하는 패턴입니다.이를 통해 프로그램은 특정 사례에 대해 작성해야 하는 개체를 보다 유연하게 결정할 수 있습니다.
- 추상 팩토리 그룹은 공통 테마를 가진 팩토리를 객체화합니다.
- 빌더는 구성과 표현을 분리하여 복잡한 객체를 구성합니다.
- 공장 메서드는 생성할 정확한 클래스를 지정하지 않고 개체를 만듭니다.
- 프로토타입은 기존 개체를 복제하여 개체를 생성합니다.
- Singleton은 클래스에 대한 개체 생성을 하나의 인스턴스로만 제한합니다.
구조
클래스 및 객체 구성에 관한 것입니다.상속을 사용하여 인터페이스를 구성하고 새로운 기능을 얻기 위해 개체를 구성하는 방법을 정의합니다.
- 어댑터를 사용하면 호환되지 않는 인터페이스를 가진 클래스는 자체 인터페이스를 기존 클래스의 인터페이스로 감싸 함께 작동할 수 있습니다.
- 브릿지는 추상화를 구현에서 분리하여 두 가지를 독립적으로 변경할 수 있도록 합니다.
- Composite는 0개 이상의 유사한 개체를 구성하므로 하나의 개체로 조작할 수 있습니다.
- 데코레이터는 오브젝트의 기존 메서드에 동작을 동적으로 추가/덮어쓰기합니다.
- 파사드는 많은 코드에 대한 단순한 인터페이스를 제공합니다.
- Flyweight는 다수의 유사한 개체를 만들고 조작하는 비용을 절감합니다.
- 프록시는 액세스를 제어하고 비용을 절감하며 복잡성을 줄이기 위해 다른 개체의 자리 표시자를 제공합니다.
행동
이러한 설계 패턴의 대부분은 특히 객체 간의 통신과 관련이 있습니다.
- 책임 체인은 명령을 처리 개체 체인에 위임합니다.
- 명령어는 액션과 파라미터를 캡슐화하는 객체를 만듭니다.
- 통역사는 전문 언어를 구현합니다.
- 반복기는 기본 표현을 노출하지 않고 개체의 요소에 순차적으로 액세스합니다.
- Mediator는 메서드에 대한 자세한 지식을 가진 유일한 클래스이기 때문에 클래스 간의 느슨한 결합을 가능하게 합니다.
- Memento는 개체를 이전 상태(실행 취소)로 복원할 수 있는 기능을 제공합니다.
- 옵서버는 퍼블리시/구독 패턴으로 다수의 옵서버오브젝트가 이벤트를 표시할 수 있도록 합니다.
- State에서는 오브젝트의 내부 상태가 변경되었을 때 오브젝트의 동작을 변경할 수 있습니다.
- 전략을 통해 런타임에 알고리즘 패밀리 중 하나를 즉시 선택할 수 있습니다.
- 템플릿 메서드는 알고리즘의 골격을 추상 클래스로 정의하므로 하위 클래스가 구체적인 동작을 제공할 수 있습니다.
- 방문자는 메서드의 계층을 하나의 객체로 이동함으로써 알고리즘을 객체 구조에서 분리합니다.
비판
소프트웨어 설계 패턴의 개념, 특히 설계 패턴에 대한 비판이 제기되어 왔습니다.디자인 패턴에 대한 주요 비판은 그 패턴이 단순히 C++에서 누락된 기능에 대한 회피책일 뿐이며 우아한 추상적 특징을 길고 구체적인 패턴으로 대체하여 본질적으로 "휴먼 컴파일러"가 된다는 것입니다.Paul Graham은 다음과 같이 썼다.[4]
프로그램에서 패턴을 보면 문제가 있다고 생각해요.프로그램의 모양은 해결해야 할 문제만 반영해야 합니다.코드의 다른 규칙성은 적어도 저에게는 충분히 강력하지 않은 추상화를 사용하고 있다는 신호입니다. 종종 손으로 작성해야 할 매크로의 확장을 생성합니다.
Peter Norvig는 Design Patterns의 23개 패턴 중 16개가 Lisp 또는 [5]Dylan의 언어 기능에 의해 단순화 또는 제거되었음을 보여줍니다.관련 관찰은 측면 지향 프로그래밍 언어(AspectJ)를 사용하여 23개의 설계 패턴 중 몇 가지를 구현한 Hannemann과 Kiczales에 의해 이루어졌으며 코드 수준의 의존성이 23개의 설계 패턴 중 17개의 구현에서 제거되었고 측면 지향 프로그래밍이 d의 구현을 단순화할 수 있음을 보여주었다.무늬를 [6]엣지하다
1999년 [7][8][a]11월 3일 OOPSLA '99에서 열린 쇼 재판과 짐 코플린의 "캔자스시티 에어컨"이라는 제목의 형식을 패러디한 것과 같은 유머러스한 비판도 있었다.
Inform과의 인터뷰2009년, Erich Gamma는 저자들이 2005년에 이 책을 어떻게 리팩터링했는지를 논의하였고, 일부 패턴을 재분류하고 확장 객체/인터페이스, 종속성 주입, 유형 객체 및 null 객체와 같은 몇 가지 패턴을 추가했다고 결론지었다.Gamma는 Singleton 패턴을 제거하기를 원했지만,[9] 그렇게 하기 위한 저자들 사이의 합의가 없었다.
「 」를 참조해 주세요.
메모들
레퍼런스
- ^ Gang Of Four, 소프트웨어 개발의 People 프로젝트와 패턴을 위한 콘텐츠 작성 Wiki.
- ^ 리처드 헬름
- ^ SIGPLAN FY '05 연차보고서
- ^ Graham, Paul (2002). Revenge of the Nerds. Retrieved 2012-08-11.
- ^ Norvig, Peter (1998). Design Patterns in Dynamic Languages.
- ^ Hannemann, Jan (2002). Design pattern implementation in Java and AspectJ.
- ^ 기소.
- ^ 4인방의 쇼 재판, 브라이언 푸트
- ^ Gamma, Erich; Helm, Richard; Johnson, Ralph (2009-10-22). "Design Patterns 15 Years Later: An Interview with Erich Gamma, Richard Helm, and Ralph Johnson". InformIT (Interview). Interviewed by Larry O'Brien. Archived from the original on 2019-02-20. Retrieved 2019-09-01.