让接口不易被误用注意点一:
class Date{
public:
Date(int month,int day,int year);
...
}
容易犯两个错误:
Date(30,3,2012) //应该是3,30,2012
Date(2,30,2012)//错误的日期
为了防止类似的错误可以考虑限定参数类型
class Month{
public:
static Month Jan(){return Month(1)};
static Month Feb(){return Month(2)};
...
private:
explicit Month(int a); //explicit 用来抑制隐式转换
...
}
Date(Month:Jan(),Day(30),Year(2012));
让接口不易被误用注意点二:
Investment * createInvestment();
为避免资源泄露,createInvestment返回的指针最终必须被删除,但那至少开启了两个客户错误的机会:没有删除指针,或删除同一个指针超过一次。
解决办法:将createInvestment的返回值存储于一个智能指针如auto_ptr、shared_ptr内,因而将delete责任推给智能指针。但万一客户忘了使用智能指针肿么办?许多时候,较佳接口的设计原则是先发制人,就令factory函数返回一个智能指针。(选shared_ptr更好,因为此自能指针可以绑定资源释放函数,防止用delete代替特定的资源释放函数,最常见的shared_ptr的实现品来自boost)