function接口,class接口,template接口......每一种接口都是客户与代码互动的手动。假设面对的是一群“讲道理的人”,那些客户企图把事情做好。它们想要正确使用你的接口。这种情况下如果他们对任何其中一个接口的用法不正确,你至少也得负一部分责任。理想上,如果客户企图使用某个接口而却没有获得他所预期的行为,这个代码不该通过编译;如果代码通过了编译,它的作为就该是客户所想要的。
欲开发一个“容易被正确使用,不容易被误用”的接口,首先必须考虑客户可能做出什么样的错误。
“除非有好理由,否则应该尽量令你的types的行为与内置types一致”。客户已经知道像int这样的type有些什么行为,所以你应该努力让你的types在合样合理的前提下也有相同表现。例如,如果a和b都是int,那么对a*b赋值并不合法,所以除非你有好的理由和此行为分道扬镳,否则应该让你的types也有相同的表现。是的,一旦怀疑,就拿int做范本!
避免无端与内置类型不兼容,真正的理由是为了提供行为一致的接口。很少有其他性质比得上“一致性”更能导致“接口容易被正确使用”,也很少有其他性质比得上“不一致性”更加剧接口的恶化。STL容器的接口十分一致(虽然不是完美的一致),这使它们非常容易被使用。例如每个STL容器都有一个名为size的成员函数,它会告诉调用者目前容器内有多少对象。
任何接口如果要求客户必须记得做某些事情,就是有着“不正确使用”的倾向,因为客户可能会忘记做那件事。
要点:
1.好的接口很容易被正确使用,不容易被误用。你应该在你的所有接口中努力达成这些性质。
2.“促使正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容。
3.“阻止误用”的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。
4.shared_ptr支持定制型删除器(custom deleter)。这可防范DLL问题,可被用来自动解除互斥锁等等。