요약
- 객체지향 빵 굽기 : 팩토리 패턴
- 병렬 클래스 계층 구조 알아보기
- 팩토리 메소드 패턴의 정의
- 객체 의존성 살펴보기
- 의존성 뒤집기 원칙
- 의존성 뒤집기 원칙 적용하기
- 의존성 뒤집기 원칙을 지키는 방법
- 원재료 종류 알아보기
메모
병렬 클래스 계층 구조 알아보기
- 생산자 클래스와 거기에 대응되는 제품 클래스는 병렬 계층구조로 볼 수 있음.
- 둘다 추상 클래스로 시작하고, 그 클래스를 확장하는 구상 클래스들이 지점과, 피자를 만드는 구체적인 구현을 담당함.
팩토리 메소드 패턴의 정의
📍 팩토리 메소드 패턴(Factory Method Pattern) : 객체를 생성할 때 필요한 인터페이스를 만듦. 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정함. 팩토리 메소드 패턴을 사용하면 클래스 인스턴스 만드는 일을 서브클래스에 맡기게 됨.
객체 의존성 살펴보기
- 심하게 의존적인 PizzaStore 의존성은 다음과 같음.
- PizzaStore
- NYStyleCheesePizza
- NYStyleVeggiePizza
- NYStylePepperoniPizza
- NYStyleClamPizza
- ChicagoStyleCheesePizza
- ChicagoStyleVeggiePizza
- ChicagoStylePepperoniPizza
- ChicagoStyleClamPizza
의존성 뒤집기 원칙
- 구상 클래스 의존성을 줄이는게 좋음.
- 의존성 뒤집기 원칙(Dependency Inversion Principle)
📍 디자인 원칙 : 추상화된 것에 의존하게 만들고 구상 클래스에 의존하지 않게 만든다.
- 이 디자인 원칙은 “구현보다는 인터페이스에 맞춰서 프로그래밍한다” 원칙과 똑같다고 생각할 수 있음.
- 물론 비슷하지만, 의존성 뒤집기 원칙에서는 추상화를 더 많이 강조함.
- 고수준 구성 요소가 저수준 구성 요소에 의존하면 안 되며, 항상 추상화에 의존하게 만들어야 한다는 뜻을 담음.
- ex) 고수준 구성 요소 : PizzaStore → 피자스토어의 행동은 피자에 의해 정의됨.
- 저수준 구성 요소 : Pizza
의존성 뒤집기 원칙 적용하기
- 심하게 의존적인 PizzaStore 의 가장 큰 문제는 PizzaStore 가 모든 종류의 피자에 의존하는 점임.
- 팩토리 메소드 패턴을 적용하면 고수준 구성 요소인 PizzaStore와 저수준 구성 요소인 피자객체 모두 추상 클래스인 Pizza에 의존하게 됨.
- 팩토리 메소드 패턴이 의존성 뒤집기 원칙을 준수하는 유일한 방법은 아니지만, 적합한 방법 중 하나임.
- 왜 의존성 “뒤집기” 인가?
- 객체지향 디자인을 할 때, 일반적으로 생각하는 방법과 반대로 뒤집어서 생각해야하기 때문
- 저수준 구성 요소(피자 구상 클래스)가 고수준 추상 클래스(Pizza)에 의존함.
- 의존성이 위에서 아래로만 내려가던 걸 반대로 뒤집음.
의존성 뒤집기 원칙을 지키는 방법
- 다음 가이드 라인을 따르면 의존성 뒤집기 원칙에 위배되는 객체지향 디자인을 피하는데 도움이 됨.
- 변수에 구상 클래스의 레퍼런스를 저장하지 말자.
- 팩토리를 써서 구상 클래스의 레퍼런스 변수에 저장하는 일을 미리 방지하자.
- 구상 클래스에서 유도된 클래스를 만들지 말자.
- 이 유도된 클래스를 만들면 특정 구상 클래스에 의존하게 됨.
- 인터페이스나 추상 클래스처럼 추상화된 것으로 부터 클래스를 만들어야 함.
- 베이스 클래스에 이미 구현되어 있는 메소드를 오버라이드 하지 말자.
- 이미 구현되어 있는 메소드를 오버라이드 하면 베이스 클래스가 제대로 추상화 되지 않음.
- 즉, 베이스 클래스에서 메소드를 정의할 때는 모든 서브클래스에서 공유할 수 있는 것만 정의해야 함.
- 물론 이 원칙을 완벽히 지킬 수 있는건 아님.
- 이 가이드라인을 완벽히 습득한 상태에서 디자인 하면 원칙을 지키지 않은 부분을 명확히 파악할 수 있고, 합리적인 상황에서 불가피한 상황에서만 예외를 둘 수 있음.
원재료 종류 알아보기
- 만약, 특정 지점에서 자잘한 재료를 더 싼 재료로 바꿔서 마진을 높이고 있다면?
- 원재료 품질 관리가 필요함.
- 지점 마다 거리가 있기 때문에 원재료 생산 공장을 만들어도 각 지점까지 재료 배달하기 어려움.
- 또, 지점 마다 사용하는 소스가 다를 수도 있음.
- 즉, 각 지점마다 각기 다른 소스를 배달해야 함.
원재료군으로 묶기
- 각 지점마다 사용하는 재료가 다름.
- 서로 다른 재료를 제공하려면 원재료군(families of ingredients)을 처리할 방법을 생각해야 함.
- 특정 재료로 구성된 군을 각 지역마다 구현해야 함.
댓글