让接口容易被正确使用,不易被误用E18
1.限制类型内什么事可以做,什么不可以做。
假设有一个表现日期的类有1个需要用户输入的构造函数。
class Date{
public:
Date(const Year& y,const Mouth& m,const Day& d);
…
};
Date date(Year(1996),Mouth::Mar(),Day(30));
但是有可能把年月日的顺序记错,或者可能输入非法的月份。
class Year{
explicit Year(int y):val(y){}
int val;
}
class Day{
explicit Day(int d):val(d){}
int val;
}
为了能够让用户输入时及时避免错误的输入,设计了年月日3个类。另外1个例子是以const修饰operator*的返回类型(E03)。
class Mouth{
public:
static Mouth Jan(){ return Mouth(1); }
…
static Mouth Dec(){ return Mouth(12); }
//参考E04程序保证在调用Date类的构造函数之前初始化Mouth类
…
private:
explicit Mouth(int m);
…
};
2.尽量保持与内置类型的行为一致。
3.尽量避免要求客户记得做某事。