개발 서적 기록/오브젝트_조영호

25일차 - 상속의 위험성 : 결합도 증가&캡슐화 감소

밍 끄적 2023. 9. 4. 23:07
728x90

2023.09.04 MON

322p ~ 335p

 

24일차 내용 ⬇️

2023.08.29 - [개발 서적 기록/오브젝트_조영호] - 24일차 - DIP와 중복 코드 제거하기

 

24일차 - DIP와 중복 코드 제거하기

2023.08.29 TUE 300p ~ 322p 23일차 내용 ⬇️ 2023.08.25 - [개발 서적 기록/오브젝트_조영호] - 23일차 - 의존성 주입 23일차 - 의존성 주입 2023.08.25 FRI 289p ~ 304p 22일차 내용 ⬇️ 2023.08.24 - [개발 서적 기록/오

magenta-ming.tistory.com


상속은 결합도를 높이고 캡슐화를 떨어트린다

상속은 자식 클래스를 점진적으로 추가해서 기능을 확장할 수 있다.

반면 높은 결합도를 만들어서 부모 클래스를 점진적으로 개선하는 것이 어려워진다. 

모든 자식 클래스를 동시에 수정하고 테스트해야하는 경우가 발생할 수 있는 것이다.

 

새로운 행동이 파생 클래스에게 상속될 때, 파생 클래스의 잘못된 동작을 초래할 수 있는 취약성을 고려해야한다.

이를 위해서 기반 클래스의 메서드가 이런 암묵적인 위험은 없는지 확인하고, 모든 파생 클래스를 테스트하고, 기반 클래스와 파생 클래스를 사용하는 모든 코드가 새로운 코드로 인해 영향을 받지 않았는지 점검해야한다.

 

이런 취약성은 결합도를 높일 뿐만 아니라, 자식 클래스가 부모 클래스의 구현 세부사항에 의존하게도 만들기 떄문에 캡슐화도 떨어진다.

어떤 클래스를 상속하려고 한다면, 상속을 위해서 클래스를 설계하고 문서화해야하는데, 이는 API 문서가 무슨 일을 기술하는 것이 아니라 어떻게 구현되는지를 기술하게 되고 이것은 지양해야한다. 상속이 캡슐화를 위반한 것이기 때문이다.

코드 중복은 추상화를 통해 해결하자

코드 중복 문제를 해결하기 위해 상속을 사용하면 결합도가 높아지고 캡슐화가 떨어져서 부모 클래스의 구현을 영원히 변경하지 않거나, 자식 클래스와 부모 클래스를 동시에 변경해야한다.

 

그래서 단순히 상속을 적용하지 않고 아래 두가지 원칙을 지켜야한다.

1. 두 메서드가 유사하다면, 차이나는 부분을 메서드로 추출해서 동일한 형태로 만들자.

2. 자식 클래스의 추상적인 메서드를 부모 클래스로 올려 재사용성과 응집도를 높이자. 부모 클래스의 코드를 자식 클래스로 내리지 말자.

728x90