TypeScript의 개방/폐쇄 원칙

Classes should be open for extension but closed for modification.



이 원칙의 기본 아이디어는 기존 클래스를 확장하되 수정해서는 안 된다는 것입니다. 기존 클래스를 수정하면 이미 테스트 및 검토된 코드가 깨질 위험이 있습니다.

이 원칙의 주요 이점은 이전 코드를 건드리지 않고도 새 기능을 추가할 수 있다는 것입니다. 이렇게 하면 원래 클래스의 현재 사용을 중단하지 않습니다.


다음 잘못된 예에서 Order 클래스가 각 기존 배송 방법에 대한 배송비를 계산하는 방법을 볼 수 있습니다.

class Order {
  id: number;
  items: string[];
  shipping: string;

  // constructor

  getTotalCost(): number {
    // calculates total cost
  }

  getShippingCosts(): number {
    const totalCost = this.getTotalCost();

    if (this.shipping === "ground") {
      return totalCost > 50 ? 0 : 5.95;
    }

    if (this.shipping === "air") {
      return 10.95;
    }

    return 0;
  }
}


새 배송 방법을 추가하려면 Order 클래스를 수정해야 합니다. 개방/폐쇄 원칙에 따라 각 배송 방법에 대해 인터페이스와 이를 구현하는 클래스를 생성하여 이 문제를 해결할 수 있습니다.

class Order {
  id: number;
  items: string[];
  shipping: Shipping;

  // constructor

  getTotalCost(): number {
    // calculates total cost
  }
}

interface Shipping {
  getShippingCosts(totalCost: number): number;
}

class Ground implements Shipping {
  getShippingCosts(totalCost: number): number {
    return totalCost > 50 ? 0 : 5.95;
  }
}

class Air implements Shipping {
  getShippingCosts(): number {
    return 10.95;
  }
}

class PickUpInStore implements Shipping {
  getShippingCosts(): number {
    return 0;
  }
}

좋은 웹페이지 즐겨찾기