본문 바로가기
우테코 프리코스/프리코스 오픈미션

생성자의 파라미터가 너무 많아서 가독성이 안좋을 때는 어떡할까?

by sloth365 2025. 11. 23.

생성자에 파라미터가 너무 많아서 가독성이 떨어지는 문제가 발생했다.

이 문제를 해결하기 위해 알아보던 중 팩토리 패턴을 찾게 되었다.

 

팩토리 패턴이란 객체를 직접 생성하는 대신 객체를 생성하는 인터페이스 공장을 만들어서

객체를 생성하는 책임을 위임하는 것이다.

 

나는 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

이 클래스들에 대해서 파라미터로 받을 필요도 없어지니

생성자 메서드의 가독성도 좋아지는 장점을 얻었다.