[오브젝트] 24일차

da__ell·2023년 8월 27일
0

독서 - 오브젝트

목록 보기
24/25
post-thumbnail

p. 305 ~p. 321

6-5. 유연성에 대한 조언

유연한 설계는 유연성이 필요할 때만 옳다

유연하고 재사용 가능한 설계란 런타임 의존성과 컴파일타임 의존성의 차이를 인식하고 동일한 컴파일타임 의존성으로부터 다양한 런타임 의존성을 만들 수 있는 코드 구조를 가지는 설계를 의미한다.

변경하기 쉽고 확장하기 쉬운 구조를 만들기 위해서는 단순함과 명확함의 미덕을 버리게 될 가능성이 높다는 문제가 있다.

객체지향 코드에서 클래스의 구조는 발생 가능한 모든 객체 구조를 담는 틀일 뿐이다. 이 구조를 파악하는 유일한 방법은 클래스를 사용하는 클라이언트 코드 내에서 객체를 생성하거나 변경하는 부분을 직접 살펴보는 것 뿐이다.

불필요한 유연성은 불필요한 복잡성을 낳으므로 이러한 필요성을 판단해서 설계하여야 한다.

협력과 책임이 중요하다.

중요한 것은 객체의 협력과 책임이다. 설계를 유연하게 만들기 위해서는 협력에 참여하는 객체가 다른 객체에게 어떤 메시지를 전송하는지가 중요하다.

객체를 생성할 책임을 담당할 객체나, 객체 생성 메커니즘을 결정하는 시점은 책임 할당의 마지막 단계로 미뤄야만 한다. → 객체를 생성하는 방법을 신경쓰기 전에 시스템에 필요한 것(책임)들을 생각하자.

10. 상속과 코드 재사용

재사용 관점에서 상속이란 클래스 안에 정의된 인스턴스 변수와 메서드를 자동으로 새로운 클래스에 추가하는 구현 기법이다.

상속 외에도 코드를 효과적으로 재사용할 수 있는 방법은 새로운 클래스의 인스턴스 안에 기존 클래스의 인스턴스를 포함시키는 ‘합성’이다.

10-1. 상속과 중복 코드

중복코드는 의심과 불신의 씨앗이다.

DRY 원칙

중복코드는 변경을 방해하기 때문에 제거해야하는 가장 큰 이유이다. 프로그램의 본질을 비즈니스와 관련된 지식을 코드로 변환하는 것이기에 지식이 변하면 코드 역시 변경된다.

중복 코드는 코드를 수정하는데 비용을 증가시킨다. 중복 여부는 변경에 따라 판단하고 요구사항이 변경됐을 때 두 코드를 함께 수정해야 한다면 중복된 코드이다.

단일 지점 제어 원칙이라고도 부른다.

중복과 변경

요구 사항이 변경되거나 추가될 때 기존의 코드를 복사하여 새로운 클래스를 만들면 구현 시간을 절약할 수 있다. 하지만 코드 수정에 영향이 미치게 된다.

중복 코드는 코드 더미에서 어떤 코드가 중복인지 파악하지 쉽지 않고 함께 수정되어야 하기 때문에 하나라도 빠뜨리면 버그로 이어진다.

중복 코드는 추가되는 것이 아닌 제거하는 것이다. DRY한 코드를 만들고자 노력하라.

두 클래스 사이의 중복 코드를 제거하는 한 가지 방법은 클래스를 하나로 합치는 것이다. 하나의 클래스에 타입 코드에 따라 로직을 분기시키는 방법도 있다. 하지만 타입 코드를 사용하는 클래스는 낮은 응집도와 높은 결합도라는 문제를 가진다.

객체 지향 프로그래밍 언어는 타입 코드를 사용하지 않고도 중복 코드를 관리하는 효과적인 방법을 제공한다. → 상속

상속을 이용해서 중복 코드 제거하기

상속의 기본 아이디어 : 이미 존재하는 클래스와 유사한 클래스가 필요하다면 코드를 복사하지 말고 상속을 이용해 코드를 재사용하는 것

상속을 염두에 두고 설계되지 않은 클래스를 상속을 이용해 재사용하는 것은 쉽지 않다. 요구사항과 구현의 차이가 클 수록 코드를 이해하기 어렵다.

상속을 이용해 코드를 재사용하기 위해서는 부모 클래스의 개발자가 세웠던 가정이나 추론 과정을 정확히 이해해야 한다. → 자식 클래스의 작성자가 부모 클래스의 구현 방법에 대한 정확한 지식을 가져야 한다.

부모 클래스와 자식 클래스의 결합이 문제인 이유

부모 클래스에 요구사항이 추가될 경우 자식 클래스에도 유사한 코드를 추가해야할 경우가 있다.

따라서 상속을 사용할 때 super 호출을 제거하는 방법을 찾아서 결합도를 제거하는 것이 중요하다.

상속으로 인해 자식 클래스가 부모 클래스의 변경에 취약해지는 현상을 취약한 기반 클래스 문제라고 부른다

profile
daelkdev@gmail.com

0개의 댓글