[c#] 리팩터링과 객체 지향 설계

개요

이번 포스트에서는 리팩터링과 객체 지향 설계에 대해 배워보겠습니다. 리팩터링은 코드를 재구성하여 이해하기 쉽고 유지 보수하기 쉽도록 만드는 과정이며, 객체 지향 설계는 코드를 객체 지향적인 방식으로 구조화하는 것을 말합니다. 객체 지향 설계를 통해 유연하고 확장 가능한 시스템을 만들 수 있으며, 리팩터링을 통해 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.

리팩터링

리팩터링은 코드의 구조를 변경하지 않고 내부 동작을 개선하는 과정입니다. 코드 중복을 제거하거나, 복잡한 조건문을 간소화하거나, 메서드를 분리하는 등의 작업을 통해 코드의 품질을 향상시킵니다. 리팩터링을 하면 코드를 이해하기 쉽고 수정하기 쉽도록 만들 수 있으며, 버그를 찾고 수정하는데 도움이 됩니다.

예를 들어, 다음은 기존 코드의 중복을 제거하는 예시입니다.

void CalculateTotalPrice(Order order)
{
    decimal totalPrice = 0;

    foreach (var item in order.Items)
    {
        totalPrice += item.Price;
    }

    foreach (var discount in order.Discounts)
    {
        totalPrice -= discount.Amount;
    }

    ApplyTax(totalPrice);
}

위의 코드에서 CalculateTotalPrice 메서드는 중복된 코드를 포함하고 있습니다. 이를 리팩터링하여 중복 코드를 제거한다면 아래와 같이 개선할 수 있습니다.

decimal CalculateTotalPrice(Order order)
{
    decimal totalPrice = CalculateItemsTotalPrice(order);
    totalPrice -= CalculateDiscountsTotalAmount(order);
    return ApplyTax(totalPrice);
}

decimal CalculateItemsTotalPrice(Order order)
{
    decimal totalPrice = 0;
    foreach (var item in order.Items)
    {
        totalPrice += item.Price;
    }
    return totalPrice;
}

decimal CalculateDiscountsTotalAmount(Order order)
{
    decimal totalAmount = 0;
    foreach (var discount in order.Discounts)
    {
        totalAmount += discount.Amount;
    }
    return totalAmount;
}

위와 같이 각 기능을 담당하는 메서드를 분리함으로써 코드를 더욱 명확하고 유지보수하기 쉽도록 만들 수 있습니다.

객체 지향 설계

객체 지향 설계는 코드를 객체들의 상호작용으로 모델링하는 과정입니다. 이를 통해 코드의 유연성과 재사용성을 향상시킬 수 있습니다. 객체 지향 설계는 추상화, 캡슐화, 상속, 다형성과 같은 개념을 기반으로 합니다.

예를 들어, 주문 시스템을 구현하는 경우, 객체 지향 설계를 통해 Order, Item, Discount 등의 클래스를 만들어 각 객체들의 역할을 명확히 할당하고, 이들의 상호작용을 표현할 수 있습니다.

class Order
{
    public List<Item> Items { get; set; }
    public List<Discount> Discounts { get; set; }

    public decimal CalculateTotalPrice()
    {
        decimal totalPrice = 0;
        foreach (var item in Items)
        {
            totalPrice += item.Price;
        }
        foreach (var discount in Discounts)
        {
            totalPrice -= discount.Amount;
        }
        return totalPrice;
        // 세금 적용 코드는 생략
    }
}

class Item
{
    public decimal Price { get; set; }
}

class Discount
{
    public decimal Amount { get; set; }
}

위의 예시에서 Order, Item, Discount 클래스로 객체 지향적인 설계를 도입하여, 코드의 가독성을 높일 뿐만 아니라 유연한 기능 추가와 유지보수를 가능케 합니다.

결론

리팩터링과 객체 지향 설계는 코드의 유지보수성과 가독성을 향상시키는 데 도움을 줍니다. 적절한 리팩터링과 객체 지향 설계를 통해 코드의 용이함과 확장성을 향상시킬 수 있으며, 효과적인 개발을 이끌어갈 수 있습니다.

참고 자료