OBJECT 09 LSP 위반(코드스핏츠)
object 책을 강의한 코드스핏츠 유튜브 요약
📜 제목으로 보기
- 참고 유튜브 : https://www.youtube.com/watch?v=navJTjZlUGk
- 정리본: https://github.com/LenKIM/object-book
- 코드: https://github.com/eternity-oop/object
- 책(목차) : https://wikibook.co.kr/object/
ch9. 리스코프 치환원칙 for 헐리우드 원칙(묻지말고 시켜)
- 책 추천:
객체 지향과 디자인 패턴
(최범균 저)- 오브젝트에서 배운 내용을 더 얇게 잘 정리함
- 뜬그룸잡는 코드없이 실무적으로 잘 가르켜 준다고 함
- 오브젝트 책 6장의 내용 나갈 것임
- 디미터의 원칙(최소지식 = 아는 놈으로 직거래만 하자)
- 헐리우드 원칙((걔는 계속 변하니까)묻지마(받아서 할려고하지마) 그냥 시켜)
-
객체지향에 실패하는 이유:
- 헐리우드원칙: 물어보기 때문에 실패한다 ->
최대한 시키려고 하자
- 즉, 객체return을 요구하는 method()를 만들지말자. 받아서 뭐 하려고하는 주도권을 버리자.
- 물어본다 = 받아서 처리한다 -> 변화시 필연적으로 나도 영향을 받는다.
알아서 하라고 떤지자. 묻지마. 객체는 계속 변해. 니가 알고 있던 걔가 아니다.
- 헐리우드원칙: 물어보기 때문에 실패한다 ->
-
디미터, 헐리우드 2 원칙
은 객체지향이라기 보다수정에 강한 코드
를 만들어낸다.- 이 2 원칙과 밀접한 관계를 가지는 것이 SOLID원칙 중
리스코프 치환, 개방폐쇄 2 원칙
이다.LSP
,OCP
를 지키려면,헐리우드원칙
을 사용할 수 밖에 없다.
- 코드로 배워보자.
- 이 2 원칙과 밀접한 관계를 가지는 것이 SOLID원칙 중
LSP
- 리스코프 치환 원칙: 자식 형으로 부모 형(자리에)을 안전하게 대치할 수 있다.
- 지난번 공부
-
부모CLASS형 자리에는 자식Class형을 집어넣어서
원칙을 지키는지 판단- ex> 생물-숨쉰다()다리로이동한다() -> 아메바
- 그렇지 않을 땐, 부모class(추상층의) 메소드를 따로 빼내서 자식들의 공통점만 가지게 수정한다
- 추상층을 어떻게 잘만들까? 어떻게 추상층이 함부러 나대지 않게 만들까?
-
- 상속을 지원하므로 당연한 얘기 같지만, 그렇지 않다.
- 지난번 공부
- 어떤 구상클래스들의 메소드가 공통이면 -> 공통메소드를 추상클래스(or인터페이스)로 뽑아낼 수 있다.
- 이것을
추상화
라 한다.
- 이것을
- 그런데 이런 것은 대부분 성급한 추상화다.
- 예를들면, 공통인줄만 알았는데, 다른 구상클래스에는 존재 하지 않은 메소드c()로 바뀔 수 있기 때문이다.
- 대부분의 개발자들은 귀찮아서 fake c()를 만들어서, 강제로 공통메소드로 주입시킨다
- 하지만 c()를 강제로 넣은 순간 리스코프 치환 원칙 위배이다. fake c()를 집어넣는 것 때문에 숨겨진 context 버그가 일어나기 때문
-
fake c()를 만들지말고,
일부공통인 메소드 c()를 구상하는 새로운 추상층
을 만들고,전체공통 a()b() 추상층
을 따로 두어서 리스코프 치환 원칙을 만족시킨다.
-
리스코프 치환 원칙은 위의 예처럼
스펙(공통메소드)가 줄어들 때 유용
하다- 즉, 새로나온 녀석이 공통점이 줄어든체로 등장하면 굉장히 쓸모이다.
- 그렇다면, 스펙(공통메소드)가 늘어나는 경우는 어떨까?
-
공통점을 다 추상화된 상태인데? 리스코프 치환 원칙은 지킨 상태다.
-
혼자 늘어난 d()는 어떻게 할까?
- 이것이 바로 다운캐스팅을 일으키는 (=LSP을 위배시키는) 코드다.
- 다운캐스팅을 쓰는 순간 OCP도 자동으로 망가진다.
- 다운캐스팅없이는 늘어날때는 쉽지 않다.
- 열심히 설계했는데도, instanceof 와 다운캐스팅이 넘쳐나는 이유이다.
- 이것이 바로 다운캐스팅을 일으키는 (=LSP을 위배시키는) 코드다.
-
언어적인 수단으로
제네릭
을 이용해서 이 문제를 해결한다.- 저번시간에는
형을 인식하는 제네릭
- 이번에는
리스코프 치환 원칙이 확장형으로 일어날 때, 확장하여 다운캐스팅을 방지하는 제네릭
을 공부할 것이다.
- 저번시간에는
-
혼자 늘어난 d()는 어떻게 할까?
-
공통점을 다 추상화된 상태인데? 리스코프 치환 원칙은 지킨 상태다.
Generic for 확장형 LSP 해결
- 코드를 LSP를 시도하면서 삽질하고, 제네릭으로 바꿔보면서, OCP원칙을 지켜가는 과정을 재해석 해보자.
개발자의 세계
- 개발자는 IT회사내에서도 극히 희귀한 존재다.
- 개발자를 도구로 바라본다. (생각을 주면 프로그램으로 바꿔줄거야)