서브타입(subtype)은 그것의 기반 타입(base type)으로 치환 가능해야 한다.
LSP 위반은 잠재적인 OCP 위반이다. (LSP 위반은 OCP 위반을 유발한다)
상속은 IS-A관계에서 사용하는 것이 가장 좋다.
상속에서 IS-A 관계는 일반적인 개념과 구체적인 개념 사이의 관계이다.
상위 클래스가 일반적인 개념이고, 하위 클래스가 구체적인 개념이 된다. 즉, 일반 클래스(상위 클래스)를 구체화 하는 상황에서 상속을 사용해야 한다.
예시
고양이는 동물이다.
Cat is an Animal
💡 상위 클래스: 동물 / 하위 클래스: 고양이
예를 들어, PersistentSet이 어떤 스트림에도 쓰이고 나중에 다른 어플리케이션에 의해서도 다시 읽힐 수 있는 집합이라고 가정했을 때,
만약 Add 메서드가 특정 타입인 경우 PersistentObject
에서 파생된 것이 아닌 경우에는 LSP를 위배하게 된다.
이때, 위 구조처럼 LSP 관점에서 문제가 되는 메서드는 서브 클래스로 분리하고 문제 없는 메서드는 기반 클래스로 분리하면 문제를 해결할 수 있다.
LSP를 지키기위한 다양한 방식 중 가장 적용하기 편한 설계 수단이 공통 인자 추출(인터페이스 분리) 방법이다. 공통 인자를 추출하는 방법은 위 사진과 같다.
LSP 위반의 단서를 보여주는 휴리스틱은 다음과 같다.
LSP는 OCP를 가능하게 하는 요인 중 하나이다. 이것은 기반 타입으로 표현된 모듈을 수정 없이도 확장 가능하게 만드는, 서브 타입의 (특히 행위) 치환 가능성을 말한다.
즉, LSP는 모듈을 수정 없이도 확장 가능하게 만들어주기 때문에, "수정에 닫혀있고 확장에 열려있어야 한다" 를 주장하는 OCP 를 가능하게 한다.
또한 LSP에서 상속을 주요하게 다루기 때문에, 관련해서 자주 쓰이는 'IS-A' 관계에 대해서도 잘 알아두면 좋을 것 같다.
끗 !