Skip to content

Commit

Permalink
feat: #39 wedge, LSP 업데이트
Browse files Browse the repository at this point in the history
  • Loading branch information
sihyung92 authored Nov 10, 2021
1 parent 6ea1681 commit 0b30644
Showing 1 changed file with 9 additions and 0 deletions.
9 changes: 9 additions & 0 deletions designpattern/q1-SOLID란 무엇인가/wedge.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,12 @@ writeInput이라는 메서드로 추상화 했으면 어떨까? Writer라는 인
하지만 OCP를 실제 적용하는 데에는 'Crystal Ball'이라는 문제가 있다. 우리는 미래의 요구사항 변화를 마치 요술사의 수정구 처럼 정확하게 예상할 수 없다. 불가능하다고 단언할 수 있다.

경험으로부터 변화가 예상되는 사항들이 있다. 해당 내용들은 abstraction을 통해 보호하고, 아직 오지 않은 변경사항에 대해선 고객의 요구가 있을 때 까지 기다리자.

# LSP Liskov Substitution Principle, 리스코프 치환원칙

AB의 상속을 받는다면, BA의 역할을 그대로 수행할 수 있어야 한다.
하위 타입이 상위 타입의 역할을 그대로 수행할 수 없다면, 하위 타입을 사용하는 클래스에서의 버그 가능성을 암시한다. 예컨데 ArrayList가 List의 get을 list size를 올리는 용도로 사용한다면(상위 객체의 역할을 바꾼다면), List를 활용하는 객체에서 ArrayList 구현체를 활용하는 순간 버그로 이어질 수 있다.

가장 대표적인 사례는 직사각형을 상속한 정사각형이다. 정사각형은 높이와 너비가 동일해야한다는 제약사항이 있다. 직사각형의 setHeight(); 를 활용하는 순간, 정사각형은 스스로의 제약사항으로 인해 정사각형이 아니게 된다. 직사각형의 구현체로 정사각형을 사용하면 버그가 생길 수 있는 가능성을 만들게 된다.

직사각형의 setHeight와 setWidth를 없앤다면 어떨까? 불변하게 만듦으로써 정사각형의 제약사항이 무너질 가능성이 사라졌다. getHeight()와 getWidth()는 정사각형이 직사각형을 완벽하게 대체할 수 있다. 이러면 LSP를 충족하게 된다.

0 comments on commit 0b30644

Please sign in to comment.