개괄
3주차를 시작하기에 앞서서 다음과 같은 과제의 제출을 요구받았다.
첫 번째는 BUS 클래스를 모델링하고, 두번째는 Requirements를 만족하는 BUS 클래스를 리팩터링 하는 것이다.
문제 발생
문제를 해결하는것은 그렇게 어렵지 않지만, 요구사항을 맞추면서 미래의 요구사항을 생각해서 만드는 '설계'가 쉽지 않았다. BUS 클래스는 어떻게 만들어야 할까? 그리고 BUS객체를 생성해주는 팩토리 메서드는 어떻게 생성해야 할까?
https://github.com/choincnp/Hanghae_4thweek
시도해본 것들
팩토리 메서드 패턴이란?
"구체적으로 어떤 인스턴스를 만들지는 서브 클래스가 정한다."
다양한 구현체(Product)가 있고, 그 중에서 특정한 구현체를 만들 수 있는 다양한 팩토리(Creator)를 제공할 수 있다.
OCP와 비슷한 맥락이다. 최대한 메서드를 팩토리 인터페이스에 빼놓고 구체적인 것만 하위 모듈에서 정한다.
핵심 : 새로운 클래스를 만들 때 기존 코드를 건드리냐 아니냐가 핵심
복습 :
팩토리 메소드 패턴을 적용했을때의 장점, 단점
- 장점
- OCP를 잘 지킬 수 있다. 객체가 추가되어도 if-else등의 구문에서 자유롭다.
- 코드를 간결하게 구현할 수 있다.
- 단점
- 클래스가 너무 많이 늘어난다.
여기서 OCP란 무엇일까?
- SRP와 마찬가지로 기존 클래스에서 어떤 클래스를 수정해야 할 때 기존 클래스를 건드리지 않고 새로운 인스턴스를 다른 방법으로 확장할 수 있어야 한다.
- 새로운 클래스를 설계할때는 확장성이 있어야 한다.
- 나중에 설명할 때 “무엇”이 확장이고 “무엇”이 변경인지 말해줘야 함.
DIAGRAM
설계한 것을의 Diagram을 뽑아내면 다음과 같다.
원래는 자바 11 위에서는 interface 안에 default modifier를 사용해 구현된 메서드를 넣을 수 있지만,
내가 아직 배우기로는 "인터페이스 안 모든 메서드는 public abstract여야 한다"이기 때문에, 팩토리 인터페이스 안에 모든것을 넣기보다는, 하위의 busfactory라는 추상 클래스에 의존하도록 설정했다.
나중에 혹시나 대형버스 / 소형버스별로 다르게 생성할 수 있어야 해서
그 busfactory를 상속받는 LargeBusFactory와 SmallBusFactory로 나눠 구현했다.
Bus 인스턴스와 Taxi 인스턴스는 Vehicle을 상속받으며, 위의 요구사항을 맞춰 설계했다.
버스의 상태는 Enum으로 운행중과 차고지행으로 나누었다.
가장 고민한 부분은, 요구사항 중 버스 객체는 고유값으로 설정되어야 하는데, 큰 버스와 작은 버스의 고유값은 겹치지 않게끔 해야하는 것이었다.
그래서
BusFactory 안에 busNum을 설정해두고,
BusFactory를 상속받는 하위 XXXBusFactory에 sequence를 설정해 두었다.
사실 이렇게 쓰고보니 꽤 간단한 일이었는데, 당시에는 정말 고민을 많이 했다.
팩토리 메서드의 단점으로 많은 클래스를 꼽았는데, 디렉토리로 나눠두면 오히려 더 깔끔하고 좋을 것 같다.
'웹개발 > 항해' 카테고리의 다른 글
항해 4주차, - Week I learned (0) | 2023.02.12 |
---|---|
Spring boot + JPA를 이용한 간단한 게시판 api 구현해보기 (0) | 2023.02.07 |
항해 3주차, 객체지향의 길목에서 - Week I learned (0) | 2023.02.05 |
TIL - RestTemplate로 유튜브에서 검색결과를 받자 (0) | 2023.02.02 |
항해 2주차, 객체지향으로 가는 길 - Week I learned (0) | 2023.01.30 |