관리 메뉴

김종권의 iOS 앱 개발 알아가기

[Clean Architecture] 10. SOLID 원칙 - LSP (Liskov Substitution Principle) 본문

Clean Architecture/Clean Architecture 기초

[Clean Architecture] 10. SOLID 원칙 - LSP (Liskov Substitution Principle)

jake-kim 2021. 6. 21. 22:46

LSP

  • 부모 클래스의 객체 대신에 자식 클래스의 객체로 치환해도 프로그램의 행위에 변화를 주지 않아야 한다는 원칙
    • 자식 클래스 or 구현체를 만들 때, 상위 타입의 객체로 치환해도 문제가 없는지 파악해야 한다는 의미
    • 인터페이스를 구현한 구현체 역시도 LSP원칙을 준수
  • 목적: 치환 가능성을 조금이라도 위배하면, 추후 상당량의 별도 메커니즘이 필요

정사각형 - 직사각형 문제

  • 사각형의 하위 타입으로 정사각형으로 구성하면 LSP위배
  • User입장에서는 Interface인 Reactangle의 성격을 생각하고 사용하지만, Square에서의 성격이 다른경우가 존재하면 오류 발생
    • 그 오류를 해결하기 위해서는 상당량의 별도 매커니즘이 User에 필요하게 되는 악순환 발생

  • 예시) setH, setW 호출 후 넓이 계산하는 행위를 정사각형 객체로 치환할 경우, 변화를 주는 현상
var r: Reactangle = Square()
r.setW(5)
r.setH(2)
r.area() // User입장에서는 10을 기대하고 사용하겠지만, 값으로는 4로 나오는 현상
  • LSP를 지키지 않으면, 별도의 매커니즘이 추가되며 오염된 코드화
    • ex) if문을 이용하여 Reactangle인지 Square인지 파악하는 매커니즘이 User로직에 추가되며, User의 행위가 사용하는 타입에 의존하게되므로 결국 타입을 서로 치환할 수 없게 되는 현상 발생

* 참고

Clean Architecture

Comments