좋은 객체 지향 설계의 5가지 원칙(SOLID)

Leo·2023년 1월 29일
0

예제코드

public class OrderServiceImpl implements OrderService{    

    private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
    ....
}
public class AppConfig {

    private DiscountPolicy getDiscountPolicy() {
        //return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }
}

1. SRP 개방-폐쇄 원칙(Open/closed principle)

한 클래스는 하나의 책임만 가져야 한다.

  • 구현 객체를 생성하고, 연결하고, 실행하는 다향한 책임을 가져서는 안된다.
  • 클라이언트 객체는 실행하는 책임만 담당한다.
  • 해당 예제에서는 클라이언트 클래스가 구현 객체를 직접 생성하고, 연결하고, 실행하고 있으므로 SRP 위반

2. OCP 개방-폐쇄 원칙(Open/closed principle)

소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.

  • 다형성을 사용하고 클라이언트가 DIP를 지키면 OCP를 지킨다고 볼 수 있음
  • 위 예제코드는 인터페이스를 생성하여 확장에는 열려 있으나 클라이언트가 직접 구현 객체를 생성 했으므로 변경 시 클라이언트 객체 변경이 발생하므로 OCP 위반
  • AppConfig를 생성하여 객체 인스턴스를 클라이언트 코드 대신 생성함으로써 클라이언트 코드를 변경할 필요가 없어짐
  • AppConfig를 사용하는 경우 소프트웨어 요소를 새롭게 확장해도 사용 영역의 변경은 닫혀있다고 볼 수 있음

3. LSP 리스코프 치환 원칙(Liksov substitution principle)

객체는 프로그램의 정확성을 깨지 않으면서 하위 타입의 인스턴스로 바꿀수 있어야 한다.

  • 클라이언트는 인터페이스 구현객체의 내부를 모르기 때문에 믿고 쓰기 위해선 인터페이스를 구현한 객체가 인터페이스의 사용 의도에 맞게 구현해야 된다

4. ISP 인터페이스 분리 원칙(Interface segregation principle)

특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다

  • 특정 클래스에서 다 쓰지 않는 다양한 추상메서드가 들어간 커다란 인터페이스 보 다는 인터페이스를 특정 클라이언트에 맞게 구체적이게 쪼개는 것을 의미

5. DIP 의존관계 역전 원칙

프로그래머는 "추상화에 의존해야지, 구체화에 의존하면 안된다." 의존성 주입은 이 원칙을 따르는 방법 중 하나다.

  • 클라이언트 객체가 구현 구체화 구현 클래스에 의존하는 경우 해당 원칙에 위배된다.
  • 추상화 인터페이스에 의존하는 것 처럼 보이지만 실제 구체화 구현 클래스에도 함께 의존 함.
  • 따라서 연결하는 책임을 가지는 AppConfig를 생성하여 객체 인스턴스를 클라이언트 코드 대신 생성해 주도록 함.

0개의 댓글