Effective-cpp-#18

Make interface easy to use correctly and hard to use incorrectly

动机

在C++中,有各种各样可以让你与代码交互的接口,但有时候一些接口的滥用会导致不必要的麻烦,因此我们要开发一个健壮的接口。

比如一个类:

1
2
3
4
class Date{
public:
Date(int month, int day, int year);
}

这种构造函数有一个问题是它可能传入一些不合法的天数或者月份,或者不小心将day和month交换

解决方法

因此我们可以用类来进行封装。

1
2
3
4
class Date{
public:
Date(const Month& m,const Day& d, const Year& y);
}

另一个守则是,任何让客户必须记得做某些事情,就可能出现“不正确使用”的倾向,例如要求new出来的原始资源必须客户记得手动删除就不是一个很好的使用方式,应该用智能指针去接管资源。

建议

  • 保证接口的一致性,以及与内置类型的行为兼容;
  • “阻止误用”的方法包括建立新类型(用类去封装),限制类型上的操作(禁止对a*b赋值),束缚对象值,以及消除客户的资源管理责任(用智能智能管理资源);