十八:Make interfaces easy to use correctly and hard to use incorrectly 让接口容易被正确使用,不易被误用
以下:
class Data
{
public:
Data(int month, int day, int year);
//..
};
这种类设计容易引起的客户错误:
1.以错误的次序传递参数
2.传递一个无效的月份或天数。
解决方案:
1.导入新的结构区别天数,月份,年份,然后在Data构造函数中使用这些类型:
然后在各自的类型中做一些限制,保持数据安全性。
2.限制类型内什么事可以做,什么事不能做。例如 const等等。
3.一致化接口的功能,
总结:
1.好的接口很容易被正确使用,不容易被误用。
2.“促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容。
3.“阻止误用”的办法包括建立新类型,限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。
4.tr1::shared_ptr 支持定制型删除器。可防范DLL问题,可被用来自动解除互斥锁等等。
十九:Treat class design as type design.设计class犹如设计type
需要考虑到的设计规范:
1.新类型的对象应该如何被创建和销毁。
这会影响到class的构造函数和析构函数以及内存分配函数和释放函数。
2.对象的初始化和对象的赋值该有什么样的差别。
区别“初始化”和“赋值”
3.copy构造函数用来定义一个type的pass-by-value该如何实现
4.对class的成员变量而言,通常只有某些数值集是有效的,这些数值集决定class必须维护的约束条件。
5.判断类是否需要被继承, 影响函数特别是析构函数是否是virtual
6.判断类需要怎么样的转换。
7.判断类需要什么要的操作符。
8.判断哪些member需要被声明为private,禁止访问
9.谁该取用新type的成员?判断哪些为public,哪些为protected,判断哪一个class或者function是友元。
10.什么是新type的“未声明接口”
11.新type有多么一般化
12.真的需要一个新的type吗?
二十:Prefer pass-by-reference-to-const to pass-by-value 宁以pass-by-reference-to-const 替换 pass-by-value
二十一:Don't try to return a reference when you must return an object.必须返回对象时,别妄想返回其reference
二十二:Declare data members private.将成员变量声明为private。
二十三:Prefer non-member non-friend functions to member functions。宁以non-member,non-friend替换member函数
二十四:Declare non-member functions when type conversions should apply to all parameters。若所有参数皆需类型转换,请为此采用non-member函数