- 디자인 패턴
- 소프트웨어 설계에서 반복적으로 발생하는 무제에 대해 반복적으로 적용할 수 있는 해결방법
- 협력을 일관성 있게 만들기 위해 재사용할 수 있는 설계의 묶음
- 프레임워크
- 설계와 코드를 함께 재사용하기 위한 것
- 일관성 있는 협력을 제공하는 확장 가능한 코드
01 디자인 패턴과 설계 재사용
소프트웨어 패턴
- 패턴의 핵심적인 특징
- 패턴은 반복적으로 발생하는 문제와 해법의 쌍으로 정의된다.
- 패턴을 이용하여 이미 알려진 문제와 이에 대한 해법을 문서로 정리할 수 있으며, 이 지식을 다른 사람과 의사소통하는데 사용할 수 있다.
- 패턴은 추상적인 원칙과 실제 코드 작성 상이의 간극을 메워주며 실질적인 코드 작성을 돕는다.
- 패턴의 요점은 실무에서 탄생했다는 점이다.
- 경험을 통해 축적된 실무 지식을 효괒거으로 요약하고 전달할 수 있다는 것이 패턴이 지닌 가장 큰 가치이다.
- 패턴은 커뮤니케이션 수단으로 활용될 수 있다.
- 패턴은 홀로 존재하지 않는다.
- 패턴 언어
- 연관된 패턴들의 집합들이 모여 구성한 것
- 패턴의 생성 규칙, 패턴 언어에 속한 다른 패턴과의 관계 및 협력 규칙을 포함
패턴 분류
- 디자인 패턴
- 중간 규모의 패턴
- 특정한 설계 문제를 해결하는 것을 목적
- 아키텍처 패턴
- 디자인 패턴 상위 개념
- 소프트웨어 전체적인 구조를 결저ㅇ
- 이디엄
- 디자인 패턴 하위 개념
- 특정 프로그래밍 언어에만 국한된 하위 레밸 패턴
- 분석 패턴
- 업무 모델링 시에 발견되는 공통적인 구조를 표현하는 개념들의 집합
패턴과 책임-주도 설계
- 객체지향 설계에서 가장 중요한 일
- 책임을 올바른 객체에게 할당하고 객체 간의 유연한 협력 관계를 구축하는 일
- STRATEGY, BRIDGE, OBSERVER, COMPOSITE
- 디자인 패턴의 구성요소는 역할과 책임이다.
- "디자인 패턴을 따른다"의 의미
- 역할, 책임, 협력의 관점에서 유사성을 공유한다는 의미
- 특정한 구현 방식을 강제한다는 것이 아니다.
캡슐화와 디자인 패턴
- STRATEGY, TEMPLATE METHOD, DECORATOR
- 어떤 디자인 패턴이 어떤 변경을 캡슐화하는지 이해하는 것이 중요
패턴은 출발점이다.
- 패턴이 설계의 목적이 돼서는 안된다.
- 컨텍스트의 적절성은 무시한 채 패턴의 구조에만 초점을 맞춰서는 안된다.
- 이는 불필요하게 복잡하고, 난해하며, 유지보수하기 어려운 시스템을 낳는다.
02 프레임워크와 코드 재사용
코드 재사용 대 설계 재사용
- 디자인 패턴
- 프로그래밍 언어 독립적으로 재사용 가능한 설계 아이디어를 제공하는 것을 목적
- 설계 아이디어를 프로그래밍 언어의 특성에 맞춰 가공해야 하고 매버 구현 코드를 재작성해야 한다.
- 프레임워크
- 설계를 재사용하면서 유사한 코드를 반복적으로 구현하는 문제를 피할 수 있는 방법
- 추상 클래스나 인터페이스를 정의하고 인스턴스 사이의 상호작용을 통해 시스템 전체 혹은 일부를 구현해 놓은 재사용 가능한 설계
상위 정책과 하위 정책으로 패키지 분리하기
- 추상화를 이용해 변경을 캡슐화
- 협력을 구현하는 코드 안의 의존성은 가급적이면 추상 클래스나 인터페이스와 같은 추상화를 향하도록 작성해야 한다.
- 상위 정책이 세부 사항보다 더 다양한 상황에서 재사용될 수 있어야 한다.
- 상위 정책과 세부 사항 모두 추상화에 의존하게 만드는 것이다.
- 프레임워크는 여러 애플리케이션에 걸쳐 재사용 가능해야 하기 때문에 변하는 것과 변하지 않는 것들을 서로 다른 주기로 배포할 수 있도록 별도의 '배포 단위'로 분리해야 한다.
- 변하는 부분과 변하지 않는 부분을 별도의 패키지로 분리하는 것
- 여러 애플리케이션에 걸쳐 일관성 있는 협력을 구현할 수 있게 해준다.
제어 역전 원리
- 의존성 역전 원리는 전통적인 설계 방법과 객체지향을 구분하는 가장 핵심적인 원리
- 프레임워크를 사용하는 경우 개별 애플리케이션에서 프레임워크로 제어 흠름의 주체가 이동한다.