Effective C++(18) 让接口更容易被正确使用,不易被误用
欲开发一个好的接口,首先必须考虑客户可能做出什么样的错误。
class Date { public: Date(int month, int day, int year); ... ... };
- 他们也许会以错误的次序传递参数,如:Date d(30, 3, 1995);
- 他们可能传递一个无效的月份或天数,如:Date d(2, 30, 1995);
struct Day { explicit Day(int d) : val(d) { } int val; }; struct Month{ explicit Month (int d) : val(d) { } int val; }; struct Year{ explicit Year (int d) : val(d) { } int val; }; class Date { public: Date(const Month& , const Day& d, const Year& y); ... ... }; // 使用 Date d(30, 3, 1995); // error,类型错误 Date d(Day(30), Month(3), Year(1995)); // error,类型错误 Date d(Month(3), Day(30), Year(1995));
让types容易被正确使用,不容易被误用。
Inverstment* createInvestment();
std::tr1::shared_ptr<Investment> createInvestment();
//创建一个null shared_ptr指针,并自带一个删除器 std::tr1::shared_ptr<Investment> pInv(0, getRidOfInvestment); // error!第一个参数应该是一个指针,而不是int // 使用转换cast std::tr1::shared_ptr<Investment> pInv( static_cast<Investment*>(0), getRidOfInvestment ); // 基于上面的定制的tr1::shared_ptr来解决上面的这个错误倾向 std::tr1::shared_ptr<Investment> createInvestment() { std::str1::shared_ptr<Investment> retVal(static_cast<Investment*>(0), getRidOfInvestment); retVal = ... ; // 令retVal指向正确对象 return retVal; }
- 好的接口很容易被正确使用,不容易被误用。应该在接口设计时努力打到这点。
- 促进正确使用的办法包括接口的一致性,以及与内置类型的行为兼容
- 阻止误用的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。
- tr1::shared_ptr支持定制删除器,这可防范DLL问题,可被用来自动解除互斥锁问题。(Effective C++(14) 在资源管理类中小心copying行为)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。