본문 바로가기

리팩토링

리팩토링-03

728x90
반응형
SMALL

타입 코드를 서브클래스로 바꾸기

Shape 클래스를 상속받는 Rectangle, Circle, Triangle 서브클래스 세 개를 만드는 예제코드

class Shape {
    func draw() {
        fatalError("draw() 메서드는 서브클래스에서 재정의되어야 합니다.")
    }
}

class Rectangle: Shape {
    override func draw() {
        print("사각형을 그립니다.")
    }
}

class Circle: Shape {
    override func draw() {
        print("원을 그립니다.")
    }
}

class Triangle: Shape {
    override func draw() {
        print("삼각형을 그립니다.")
    }
}


let rectangle = Rectangle()
let circle = Circle()
let triangle = Triangle()

rectangle.draw()  // "사각형을 그립니다."
circle.draw()     // "원을 그립니다."
triangle.draw()   // "삼각형을 그립니다."

 

 

생성자를 팩토리 함수로 바꾸기

*** 팩토리 함수(Factory Function) *** 
객체를 생성하기 위해 사용되는 특별한 유형의 함수

class Car {
    let brand: String
    let model: String
    
    private init(brand: String, model: String) {
        self.brand = brand
        self.model = model
    }
    
    static func createCar(brand: String, model: String) -> Car {
        return Car(brand: brand, model: model)
    }
}

let car = Car.createCar(brand: "Tesla", model: "Model S")
print("Car: \(car.brand) \(car.model)")

기존의 생성자를 private으로 지정하여 외부에서 직접 생성할 수 없게 만들었습니다. 대신에 createCar라는 팩토리 함수를 사용하여 객체를 생성하도록 구현하였습니다.

createCar 팩토리 함수는 brand와 model 매개변수를 받아 Car 클래스의 인스턴스를 생성하고 반환합니다. 이렇게 팩토리 함수를 통해 객체를 생성하면 외부에서는 createCar 함수를 호출하여 객체를 생성할 수 있습니다.

위의 예제 코드에서는 Car.createCar(brand: "Tesla", model: "Model S")를 통해 Car 객체를 생성하고, 생성된 객체의 속성 값을 출력합니다.

이처럼 생성자를 팩토리 함수로 바꾸는 것은 객체 생성과 관련된 로직을 팩토리 함수 내부로 캡슐화하여 가독성과 유지보수성을 향상시키는 방법입니다. 팩토리 함수를 통해 객체를 생성하면 복잡한 초기화 과정을 감추고 유연성을 제공할  있습니다.

 

 

728x90
반응형
LIST

'리팩토링' 카테고리의 다른 글

리팩토링-02  (0) 2023.05.23
리팩토링-01  (0) 2023.05.21