Item18_인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자
챕터 핵심 내용
- 좋은 인터페이스는 제대로 쓰기에 쉬우며 엉터리로 쓰기에 어렵다.
- 인터페이스의 올바른 사용을 이끄는 방법으로는 인터페이스 사이의 일관성 잡아주기, 그리고 기본제공 타입과의 동작 호환성 유지하기가 있다.
- 사용자의 실수를 방지하는 방법으로는 새로운 타입 만들기, 타입에 대한 연산을 제한하기, 객체의 값에 대해 제약 걸기, 자원 관리 작업을 사용자 책임으로 놓지 않기가 있다.
tr1::shared_ptr
은 사용자 정의 삭제자를 지원한다. 이 특징 때문에 교차 DLL 문제를 막아 주며, 뮤텍스 등을 자동으로 잠금 해제하는 데 쓸 수 있다.
- 좋은 인터페이스는 제대로 쓰기에 쉬우며 엉터리로 쓰기에 어렵다.
- 사용자 쪽에서 뭔가를 외워야 제대로 쓸 수 있는 인터페이스는 잘못 쓰기 쉽다.
- 인터페이스의 올바른 사용을 이끄는 방법으로는 인터페이스 사이의 일관성 잡아주기, 그리고 기본제공 타입과의 동작 호환성 유지하기가 있다.
- 기본제공 타입과 쓸데 없이 어긋나는 동작을 피해야 한다.
- 그렇게 함으로써 일관성 있는 인터페이스를 제공할 수 있다.
- 사용자의 실수를 방지하는 방법으로는 새로운 타입 만들기, 타입에 대한 연산을 제한하기, 객체의 값에 대해 제약 걸기, 자원 관리 작업을 사용자 책임으로 놓지 않기가 있다.
- 새로운 타입을 만들어 인터페이스를 강화하면 상당수의 사용자 실수를 막을 수 있다.
- 적절한 타입이 준비되어 있다면 각 타입의 값에 제약을 가할 수도 있다.
- 타입 안전성이 신경 쓰인다면 유효한 타입의 집합을 (지역) 정적으로 만들 수도 있다.
const
를 이용해 연산을 제한시킬 수 있다.- RAII 객체를 반환하는 팩토리 함수를 이용해 사용자의 실수를 방지할 수도 있다.
- tr1::shared_ptr
은 사용자 정의 삭제자를 지원한다. 이 특징 때문에 교차 DLL 문제를 막아 주며, 뮤텍스 등을 자동으로 잠금 해제하는 데 쓸 수 있다.
- 교차 DLL 문제(cross-DLL problem) : new/delete 짝이 실행되는 DLL이 달라 발생하는 문제
tr1::shared_ptr
은 생성된 DLL과 동일한 DLL에서 delete를 사용하도록 만들어졌다.
후기(postscript)
C++11부터는 tr1에 있던
shared_ptr
이 표준으로 들어왔다.