설명: 2분 안에 열림/닫힘 원리

시작하기 전에.



SOLID에 대해 들어본 적이 있습니까?.

SOLID are 5 software development principles or guidelines based on Object-Oriented design making it easier for you to make your projects scalable and maintainable.



규칙보다는 모범 사례에 가깝습니다. Open/Close는 SOLID Design의 원칙입니다.

그래서 무엇입니까?



Open/Close는 SOLID의 O입니다.

그것은 말한다

Software entities (classes, modules, functions, etc.) should be open for extension but closed for modification. Bertrand Meyer



새 코드와 호환되도록 기존 코드를 다시 작성하면 안 됩니다.

의미



✔️ 더 많은 코드를 추가할 수 있습니다.
✔️ 새 코드를 추가하여 이전 코드에 기능을 확장할 수 있습니다.
❌ 다른 모듈에서 사용하던 기존 코드를 수정할 수 있습니다.

목표



시스템의 핵심을 절대 깰 수 없는 지점까지 시스템을 가져오십시오. 더 많은 기능을 추가할 수 있지만 다른 모듈에서 사용하는 기능을 수정할 수는 없습니다.

이 원칙을 이미 따르고 있다면 이 원칙을 따르는 것이 더 쉬우며,

이렇게 하면 하나의 클래스를 변경하면 모든 종속 클래스도 업데이트해야 하는 상황이 방지됩니다.

예를 보여주기 위해 상속을 사용할 것입니다.

간단한 사용 사례



누군가 전자 상거래 상점에서 구입한 항목에 대해 비용을 지불한다고 가정해 보겠습니다. payment.ts에서 다음과 같이 표시될 수 있습니다(구문 무시).

class Payment {
  public payWithCash(){
    // handle cash pay logic here

  public payWithCredit(){
    // handle credit pay logic here
  }
}

function makePayment(payMethod: string) {
  const payment = new Payment();

  if(payMethod === 'cash'){
    payment.payWithCash();
  } else if(payMethod === 'credit'){
    payment.payWithCredit();
  }
}


⚠️ 새로운 결제 유형을 추가하려면 어떻게 해야 하나요? 새 메서드를 추가하고 코드를 수정해야 합니다.

class Payment {
  public payWithCash(){
    // handle cash pay logic here

  public payWithCredit(){
    // handle credit pay logic here
  }

  public payWithCoupon(){
    // handle coupon pay logic here
  }
}

function makePayment(payMethod: string) {
  const payment = new Payment();

  if(payMethod === 'cash'){
    payment.payWithCash();
  } else if(payMethod === 'credit'){
    payment.payWithCredit();
  } else if(payMethod === 'coupon'){
    payment.payWithCoupon();
  }
}


이것은 열기/닫기 원칙에 위배됩니다.


열기/닫기 원칙을 사용하여 코드payment.ts를 다음과 같이 수정합니다.

interface PaymentMethod {
  pay() : boolean
}

class Cash implements PaymentMethod {
  public pay(){
    // handle cash pay logic here
  }
}

class CreditCard implements PaymentMethod {
  public pay(){
    // handle credit pay logic here
  }
}

function makePayment(payMethod: PaymentMethod) {
  if(payMethod.pay()){
    return true;
  }
  return false;
}


이제 나중에 전신환과 같은 새 결제 옵션을 추가하려면 기존 코드를 변경할 필요 없이 새 클래스만 추가하면 됩니다.

class WireTransfer implements PaymentMethod {
  public pay(){
    // handle wire transfer pay logic here
  }
}


우리는 인터페이스를 사용하고 있으므로 SOLID의 원칙을 따르고 있는지 반드시 확인하십시오.


당신은 그것을 사용해야합니까?



깨끗한 코드를 원하면 열기/닫기를 사용해야 하지만 계속해서 자신의 작업을 수행해야 하는 상황이 있습니다. 그것은 정말로 당신이 무엇을 하느냐에 달려 있습니다.



기존 단위 테스트를 수정하지 않고 추가한 코드에 대해 새 단위 테스트를 작성할 수 있습니다.


여기 있습니다. 기사가 마음에 드십니까? 댓글을 꼭 남겨주세요.

무엇 향후 계획



원칙을 사용할 가치가 있는 이유.

좋은 웹페이지 즐겨찾기