[파이썬] 중복 코드 처리를 위한 리팩토링 스타일

중복 코드는 프로그래밍에서 피해야 할 상황이다. 중복 코드는 유지보수의 어려움을 가져오고 복잡성을 증가시킨다. 따라서 중복 코드를 처리하기 위해 리팩토링(refactoring) 기술을 사용하는 것이 좋다. 리팩토링은 코드를 변경하지 않고 구조를 개선하고 가독성을 향상시키는 것을 목표로 한다.

파이썬은 다양한 리팩토링 스타일을 지원한다. 이번 포스트에서는 중복 코드 처리를 위한 몇 가지 리팩토링 스타일을 살펴보겠다.

1. 함수 추출하기 (Extract Function)

중복 코드를 처리하는 가장 기본적인 방법은 함수 추출하기이다. 중복되는 코드 덩어리를 함수로 묶어서 재사용할 수 있다. 다음은 중복 코드를 함수로 추출하는 예제이다.

# 중복 코드 예제
def calculate_rectangle_area(length, width):
    area = length * width
    print(f"The area of the rectangle is {area} square units.")

calculate_rectangle_area(5, 3)
calculate_rectangle_area(4, 2)

위의 예제에서 calculate_rectangle_area 함수는 중복되는 코드인 “The area of the rectangle is …” 부분을 처리한다. 이 함수를 추출하여 중복 코드를 제거할 수 있다.

# 함수 추출하기 예제
def calculate_area(length, width):
    return length * width

def print_rectangle_area(length, width):
    area = calculate_area(length, width)
    print(f"The area of the rectangle is {area} square units.")

print_rectangle_area(5, 3)
print_rectangle_area(4, 2)

위의 예제에서 calculate_rectangle_area 함수를 calculate_areaprint_rectangle_area 함수로 나누었다. calculate_area 함수는 계산 로직을 담당하고, print_rectangle_area 함수는 결과를 출력하는 역할을 한다. 함수를 적절하게 나누어 관심사를 분리함으로써 코드의 가독성과 재사용성을 향상시킬 수 있다.

2. 상속과 다형성 활용하기

상속과 다형성은 중복 코드를 처리하기 위한 강력한 도구이다. 부모 클래스의 공통된 기능을 자식 클래스에서 재사용할 수 있고, 각각의 자식 클래스에서 독자적인 특성을 추가할 수 있다. 이를 통해 중복 코드를 효과적으로 처리할 수 있다.

# 상속과 다형성 예제
class Shape:
    def calculate_area(self):
        pass

class Rectangle(Shape):
    def __init__(self, length, width):
        self.length = length
        self.width = width

    def calculate_area(self):
        return self.length * self.width

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def calculate_area(self):
        return 3.14 * self.radius * self.radius

shapes = [Rectangle(5, 3), Circle(2)]

for shape in shapes:
    area = shape.calculate_area()
    print(f"The area of the shape is {area} square units.")

위의 예제에서 Shape 클래스는 공통된 기능을 정의한 부모 클래스이다. RectangleCircle 클래스는 Shape 클래스를 상속받고, 각각의 특성에 맞게 calculate_area 메소드를 재정의한다. 이를 통해 중복된 로직을 한 곳에서 관리하며, 각각의 객체에서 다른 결과를 얻을 수 있다.

3. 함수 매개변수 활용하기

함수 매개변수를 이용하여 중복 코드를 처리할 수도 있다. 매개변수를 통해 동일한 로직을 수행하되, 인자에 따라 다른 동작을 수행할 수 있다. 다음은 매개변수를 활용한 중복 코드 처리 예제이다.

# 함수 매개변수 예제
def calculate_area(length, width=None, radius=None):
    if width is None and radius is None:
        return None

    if width is not None:
        return length * width

    if radius is not None:
        return 3.14 * radius * radius

print(calculate_area(5, width=3))
print(calculate_area(2, radius=2))

위의 예제에서 calculate_area 함수는 length, width, radius 매개변수를 받는다. widthradius 중 하나만 인자로 전달하면, 해당하는 도형의 면적을 계산하여 반환한다. 이를 통해 중복 코드를 단일 함수 내에서 처리하고, 다양한 인자에 대응할 수 있다.

마무리

중복 코드는 프로그래밍에서 피해야 할 상황이지만, 때때로 발생하는 경우도 있다. 이러한 경우에는 리팩토링을 통해 중복 코드를 처리해야 한다. 파이썬을 비롯한 다양한 프로그래밍 언어에서는 다양한 리팩토링 기법을 활용하여 중복 코드를 처리할 수 있다. 위에서 소개한 함수 추출하기, 상속과 다형성, 함수 매개변수 활용하기 등의 기법을 적절히 활용하여 중복 코드를 처리해보자. 리팩토링을 통해 코드의 가독성과 재사용성을 높이고, 유지보수의 효율성을 향상시킬 수 있다.