-
[오브젝트] 10. 상속과 코드 재사용독서_dev 2024. 5. 30. 08:19반응형
- 중복 코드는 변경을 방해한다!
- 중복된 코드를 제거하는 대표적 방법 : 상속, 합성
- 상속은 결합도를 높인다. 쓸 때 매우 주의할 것. 그래도 쓴다면 추상화에 의존하도록 설계
(결론: 합성 좋잖아~ 합성 쓰자.)중복 코드는 왜 문제인가?
- (우리를 주저하게 만들고 동료들을 의심하게 만든다.)
- 변경을 방해한다.
- 어떤 코드가 중복인지 찾아야 한다.
- 모두 일괄되게 수정해야 한다.
- 모든 중복 코드를 개별적으로 테스트 해야 한다.
Don't Repeat Yourself!! (DRY)
중복코드를 쓰지 말자. 그럼 어떻게 해야 하는가.
- 타입 코드 사용
- 하지만, 낮은 응집도와 높은 결합도
- 상속
- 편하지만, 개발자의 가정을 이해하기 전에는 코드를 이해하기 어렵다.
- -> 결합도를 높인다.
상속을 위한 경고
상속은 코드 재사용과 관련된 대부분의 경우에 우아한 해결 방법이 아니다. 객체지향에 능숙한 개발자들은
상속의 단점을 피하면서도 코드 재사용을 할 수 있는 더 좋은 방법이 있다는 사실을 알고 있다...그럼에도 상속을 사용한다면 다음을 주의하자.
상속을 위한 경고 1.
자식이 부모를(super) 직접 호출할 경우 강하게 결합됨.
자식 클래스의 메서드 안에서 super 참조를 이용해 부모 클래스의 메서드를 직접 호출할 경우 두 클래스는 강하게 결합된다. super 호출을 제거할 수 있는 방법을 찾아 결합도를 제거하라.
상속을 위한 경고 2.
불필요한 인터페이스가 들어온다면 자식 클래스의 구조를 깨드릴 수 있다.
단순 재사용을 위해 불필요한 오퍼레이션이 인터페이스에 스며들도록 방치해서는 안 된다.상속 받은 부모 클래스의 메서드가 자식 클래스의 내부 구조에 대한 규칙을 깨트릴 수 있다.
상속을 위한 경고 3.
클래스가 상속되기를 원한다면 상속을 위해 클래스를 설계하고 문서화해야 하며, 그렇지 않은 경우에는 상속을 금지시켜야 한다!
- 조슈아블로치설계는 트레이드오프 활동이라는 사실을 기억하라. 상속은 코드 재사용을 위해 캡슐화를 희생한다. 완벽한 캡슐화를 원한다면 코드 재사용을 포기하거나 상속 이외의 다른 방법을 사용해야 한다.
자식 클래스가 부모 클래스의 메서드를 오버라이딩할 경우 부모 클래스가 자신의 메서드를 사용하는 방법에 자식 클래스가 결합될 수 있다.
상속을 위한 경고 4.
서브클래스는 올바른 기능을 위해 슈퍼클래스의 세부적인 구현에 의존한다. 슈퍼클래스의 구현은 변할 수 있다.
슈퍼클래스의 작성자가 확장될 목적으로 특별히 그 클래스를 설계하지 않았다면 서브클래스는 슈퍼클래스와 보조를 맞춰서 진화해야 한다.클래스를 상속하면 결합도로 인해 자식 클래스와 부모 클래스의 구현을 영원히 변경하지 않거나, 자식 클래스와 부모 클래스를 동시에 변경하거나 둘 중 하나를 선택할 수밖에 없다.
추상화에 의존하라
추상 클래스에 의존하게 만들어라.
- 차이점을 메서드로 추출
- 중복 코드를 부모로 올리기
- 의도를 드러내는 이름 선택하기
반응형