사용자가 인터페이스를 사용하면서 저지를 수 있는 실수들을 방지하기 위해서는 인터페이스 설계 차원에서 잘못 쓸수 없도록 막아야 한다.
방법의 예로 다음 세가지가 있다.
1. 부적절한 데이터를 매개변수로 넣는 것을 방지하기 위해 새로운 타입 시스템을 만든다.
ex) 날짜 데이터를 저장하는 Date 클래스가 있다고 할 때, 생성자를 Date(int month, int day, int year)로 만들기보다는 다음과 같은 데이터 타입을 만들어서 Date(Month(int m), Day(int d), Year(int y))와 같은 방식으로 생성자를 만든다.
class Month{
public:
static Month Jan() { return Month(1); } //반드시 지정된 값으로만 넣을 수 있도록
static Month Feb() { return Month(2); } //주어진 함수로만 값을 생성할 수 있게 한다.
...
private:
explicit Month(int m); //Month값이 함수로만 생성되도록 생성자를 private로 설정.
}
2. 일관성 있는 인터페이스를 제공한다.
ex)
- 기본 연산자들(+,*,- 등)을 재정의 할 경우에는 기본연산자들의 원래 동작 방식이 그대로 적용되도록 해준다.
- stl의 모든 컨테이너들은 size란 멤버함수를 가지고 있고, 동일하게 이터레이터로 순환하도록 되어있다.
3. 사용자가 외워서 사용해야할, 잊으면 제대로 사용하지 못하는 인터페이스는 잘못 쓰기 쉽다. 사용자가 제대로 사용할 수 밖에 없도록 해준다.
ex) 팩토리 함수에서 create함수가 그냥 포인터가 아닌, 스마트포인터를 반환하도록 한다.