세미나 관련
[인프콘 2023] 점진적 추상화
딱구킴
2023. 8. 19. 11:52
점진적 추상화
추상화 방향
- if문 구현
- 타입이 늘어날수록 if문을 계속 추가해야 할텐데…
- 확장에 닫혀있는 코드가 되어버린다. (OCP 위반)
- 타입을 축으로 추상화를 할 수 있다.
- interface ← class
- 인터페이스 자체를 변경하는 것은 쉽지가 않다.
- 하위 구현체들이 모두 영향을 받음
- 타입을 축으로 vs 행위를 축으로
- 타입을 축으로 → 타입 확장에 유리
- 행위를 축으로 → 행위 확장에 유리
- 어느 방향으로 발전할지 알기는 쉽지 않다.
- 소프트웨어 발전 방향과 일치하지 않는 추상화는 오히려 더 유지보수하기 힘든 코드가 발생된다.
- 현실은 더 많은 축이 존재…
- 다른 방향으로 확장할 가능성이 큼
- 초기 추상화의 모습과 현실이 전혀 다른 방향으로… → 괴리 발생
- 요구사항에 비해 훨씬 복잡해짐
- 추상화를 했음에도 불구하고 유지보수가 어려워짐
추상화 범위
- 추상화 방향 예측은 매우 어렵다.
- 추상화의 범위를 좁혔다면 어땠을까?
- 코어 로직만 추상화
- 너무 넓은 범위를 추상화 할 경우, 인터페이스 변경 위험에 더 많이 노출됨
- 인터페이스 추상화는 필요한 만큼만 하자.
- 범위를 얼마나 가져가냐에 따라 이름과 메서드가 바뀐다.
- 추상화를 고민할 때는…
- 추상화 범위가 필요한 부분에서만 이뤄지고 있는지를 점검하자
추상화 시기
- 요구사항은 끊임없이 변경된다.
- if문으로 쭉 늘어놓다 보면, 어떤걸 기준으로 추상화를 할 수 있을지를 느낄 수 있다.
- Adapter..?!
- 과거의 코드는 그 위치에 있다는 사실만으로도 상당한 영향력을 가진다
- 과거의 코드를 변경하는 것…
- 이것을 뒤엎고 추상화를 완전히 뒤집는 것은…
- 실무에서는 개발 초기단계에서 수행한 추상화는 더이상 동작하지 않을 수도…
- 때로는 날 것의 코드가 좋은 인사이트를 주기도 한다.
- 함수 단위로 잘 쪼개져 있어야 한다. → SRP !!! 중요
- 인터페이스 추출 시, 구현체들은 보이지 않는 의존성을 가진다.
- 구현체들끼리는 보이지 않는 의존성이 있다.
- 클래스 추출에서 멈추는것도 하나의 방법이다.
- 처음부터 인터페이스 정의보다는 함수 분리부터 시작하고, 클래스 분리로 응집도 확보 → 적절한 추상화 시기를 탐색
- 개발 기능을 구현하는 초기 단계에서 좋은 추상화를 만들어내기는 쉽지 않다.
변화무쌍한 요구사항을 유연하게
- 인터페이스 변경은 전체 구현에 영향
- 파라미터도 추상화를 할 것인가?
- 어떤 클래스에는 필요가 없는 파라미터일 수도 있는데… (nullable..?)
- 함수가 일급 객체인 언어에서는 콜백 메서드로 회피 가능하다.
- 함수를 파라미터로 받으면 된다.
- 하위 구현체들이 인터페이스로 강하게 묶이지 않게 된다.
요약
- 추상화는 비용이 있고, 잘못된 추상화는 혜택없이 비용만 감당해야 되기도 한다
- 추상화는 적절한 방향, 범위, 시기를 고민해야
- 함수를 추출하는 것부터 점진적으로 시작하자