생성자에 파라미터가 너무 많아서 가독성이 떨어지는 문제가 발생했다.
이 문제를 해결하기 위해 알아보던 중 팩토리 패턴을 찾게 되었다.
팩토리 패턴이란 객체를 직접 생성하는 대신 객체를 생성하는 인터페이스 공장을 만들어서
객체를 생성하는 책임을 위임하는 것이다.
나는 OptionSelector 클래스에서 각 옵션들을 직접 조립해서 만들고 보관하고 있었다.
하지만 OptionSelector는 옵션을 직접 만드는 책임과 옵션을 선택하는 책임 두 가지가 있었다.
직접 만들 책임이 있으니 만들때 필요한 객체들을 알아야 할 필요가 있었고 이것이 가독성이 안 좋은 문제였다.
이 문제를 해결하기 위해 팩토리 패턴을 응용해서 옵션을 만드는 공장을 구현했다.
public class OptionCreator {
private final GameState gameState;
private final Income income;
private final Validator validator;
private final MissionItemRule missionItem;
private final Output output;
public OptionCreator(
GameState gameState,
Income income,
Validator validator,
MissionItemRule missionItem,
Output output) {
this.gameState = gameState;
this.income = income;
this.validator = validator;
this.missionItem = missionItem;
this.output = output;
}
public List<Option> createOptions() {
Inventory inventory = new Inventory();
return List.of(
new InventoryOption(inventory, output),
new MissionOption(new MissionMachine(missionItem), inventory, income, validator, output),
new IncomeOption(income, output),
new ShutdownOption(new Shutdown(income, gameState), output, income)
);
}
}
이렇게 생성에 대한 책임을 OptionCreator클래스에게 위임해주니
OptionSelector에서는 생성에 대한 메서드를 가질 필요도 없어지고 만들 때 필요한 객체들을
생성자에서 받을 필요도 없어졌다.
public class OptionSelector {
private final List<Option> selector;
private final Validator validator;
private final Output output;
public OptionSelector(OptionCreator optionCreator, Validator validator, Output output) {
selector = optionCreator.createOptions();
this.validator = validator;
this.output = output;
}
이렇게 리팩터링하니 OptionCreator만 알고 있으면 되고
GameState, Income, Validator, MissionItemRule, Output output
이 클래스들에 대해서 파라미터로 받을 필요도 없어지니
생성자 메서드의 가독성도 좋아지는 장점을 얻었다.
'우테코 프리코스 > 프리코스 오픈미션' 카테고리의 다른 글
| assertJ를 사용하기 위한 의존성 추가 (0) | 2025.11.23 |
|---|---|
| 자바 isEmpty()와 isBlank()의 차이 (0) | 2025.11.23 |
| 값을 랜덤하게 가져오기 위해 내가 사용한 방법 (0) | 2025.11.23 |
| H2 연동 과정 (0) | 2025.11.23 |
| 내 프로젝트에 맞는 DB는? (0) | 2025.11.23 |