리팩터링/리팩터링 기법

리팩터링. Use a Builder

developer-tj 2023. 2. 26. 12:00
반응형

Use a Builder는 긴 매개 변수 목록 문제를 해결하는 방법 중 하나로, 객체 생성에 사용되는 매개변수가 많은 경우, 객체 생성을 담당하는 별도의 빌더 객체를 사용하여 객체를 생성하는 방식입니다.

 

Builder 패턴을 사용하면 매개변수를 하나씩 전달하는 대신, 별도의 빌더 객체를 사용하여 객체를 생성하고 초기화할 수 있습니다.

이를 통해 객체 생성에 필요한 매개변수의 개수를 줄일 수 있으며, 코드의 가독성과 유지보수성을 높일 수 있습니다.

 

다음은 C++ 언어를 사용하여 Builder 패턴을 구현한 예시입니다.

class Product {
public:
    double price;
    int quantity;
    double tax_rate;
    double discount;

    Product(double price, int quantity, double tax_rate, double discount)
        : price(price), quantity(quantity), tax_rate(tax_rate), discount(discount)
    {}
};

class ProductBuilder {
public:
    ProductBuilder& set_price(double price) {
        this->price = price;
        return *this;
    }

    ProductBuilder& set_quantity(int quantity) {
        this->quantity = quantity;
        return *this;
    }

    ProductBuilder& set_tax_rate(double tax_rate) {
        this->tax_rate = tax_rate;
        return *this;
    }

    ProductBuilder& set_discount(double discount) {
        this->discount = discount;
        return *this;
    }

    Product build() {
        return Product(price, quantity, tax_rate, discount);
    }

private:
    double price;
    int quantity;
    double tax_rate;
    double discount;
};

 

위의 예시에서, Product 클래스는 객체 생성 시 많은 매개변수를 받아 초기화하는 생성자를 가지고 있습니다.

이에 대해 Builder 패턴을 사용하여 ProductBuilder 클래스를 구현하였습니다.

ProductBuilder 클래스는 Product 객체를 생성하기 위한 매개변수를 설정하고, build() 메서드를 호출하여 Product 객체를 반환합니다.

이렇게 Builder 패턴을 사용하여 객체 생성에 필요한 매개변수를 관리하면 객체 생성 시 전달하는 매개변수의 개수를 줄일 수 있으며, 매개변수의 순서를 신경쓰지 않고도 객체를 생성할 수 있습니다.

또한, 객체 생성 시 필요한 매개변수가 추가되거나 제거될 때, Builder 클래스의 코드만 수정하면 되므로 유지보수성이 좋아집니다.

 

다음은 ProductBuilder 클래스를 사용하여 Product 객체를 생성하는 예제 코드입니다.

ProductBuilder builder;
builder.set_price(100.0)
       .set_quantity(2)
       .set_tax_rate(0.1)
       .set_discount(0.05);
Product product = builder.build();

위의 코드에서는 ProductBuilder 객체를 생성한 후, set_ 메서드를 사용하여 필요한 매개변수를 설정하고, build() 메서드를 호출하여 Product 객체를 생성합니다. 이를 통해 매개변수의 순서와 유형을 신경쓰지 않고도 Product 객체를 생성할 수 있습니다.

Builder 패턴을 사용하면, 객체 생성 시 필요한 매개변수를 관리하고 초기화할 수 있는 별도의 빌더 클래스를 만들어 사용하는 것이 좋습니다. 이를 통해 객체 생성 코드의 가독성과 유지보수성을 높일 수 있습니다.