6.1 재사용 철학

  • 작성은 한 번, 사용은 여러 번
  • 무슨 수를 쓰더라도 코드 중복은 피한다
  • 같은 일을 반복하지 않는다.

6.2 코드를 재사용할 수 있도록 설계하는 방법

  • 첫째, 용도나 분야가 약간 달라도 출ㅇ분히 사용할 수 있는 범용성
  • 둘째, 쉽게만들어야 한다.

6.2.1 추상화 방법

  • 인터페이스와 구현을 분리
  • 게터와 세터를 통해서 접근
  • handle : 한 인터페이스에서 리턴한 정보를 다른 곳에 전달하기 위해 클라이언트 코드에서 보관
  • 불투명 클래스 : 내부 데이터 멤버를 직접 접근하지 못하게 하거나 게터나 세터로 간접적으로 접근하게 만든 클래스

c++은 public 인터페이스와 비 public 데이터 멤버나 메서들르 모두 한 클래스 정의에서 작성할 수 밖에 없어서 클래스 내부 구현 사항이 노출될 수 밖에는 없다.

6.2.2 재사용에 최적화된 코드 구조화

  • 컴포넌트

1 서로 관련 없거나 논리적으로 구분되는 개념을 합치지 않기

  • 응집도(cohesion)을 높이는데 주력해야 한다.
  • 단일 책임 원칙(SRP)

2 범용 데이터 구조와 알고리즘 템플릿으로 구현하기

템플릿이 다른 제네릭 프로그래밍 테크닉보다 나은 이유
  • 템플릿 대신 void * 사용 가능
    • 하지만 type-safe 하지 않다
  • std::any 클래스를 사용할 수 있다
  • 데이터 구조를 특정한 클래스에 맞게 정의
  • 하지만 템플릿은 제대로 사용하면 타입 안정성 보장.
  • 템플릿을 이용하면 컴파일러가 각 템플릿 인스턴스에 맞게 고도로 최적화된 코드를 생성
    • std::any와 void *를 이용한 데이터 구조와 달리 템플릿은 저장 공간에 할당하는 작업이 필요 없다
템플릿의 단점
  • 동형 데이터 구조만을 지원
  • c++ 17부터는 이러한 동형성의 제약을 정식으로 우회하는 방법을 제공
    • std::variant나 std::any 객체로 저장하도록 정의하면 된다
  • 최종 바이너리 코드의 크기가 커지는 코드 비대 현상 발생
템플릿과 상속
  • 동일한 기능을 다양한 타입에 지공할 때는 템플릿 사용
  • 특정 타입마다 동작을 다르게 제공할 때는 상속

3 적절한 검사 기능과 안전장치 제공하기

4 확장성을 고려한 설계

  • 개방/폐쇄 원칙 (OCP)

6.2.3 사용성 높은 인터페이스 설계

1 사용자 고려하기

2 용도 고려하기

3 인터페이스를 사용하기 쉽게 설계하기

  • 연산자 오버로딩4 범용 인터페이스 설계
  • 의존성 관계를 역전시키는데 인터페이스를 사용
  • 의존성 역전 원칙
  • 이 원칙의 구현 방법 중 하나로 의존성 주입이 있다

5 범용성과 사용성의 조화

  • 인터페이스 분리의 원칙

6.2.4 바람직한 추상화 설계

  • 핌플 패턴(9장)
  • 추상화가 잘된 인터페이스는 public 메서드로만 구성된다.

6.2.5 솔리드 원칙

BELATED ARTICLES

more