[原创文章欢迎转载,但请保留作者信息]
Justin 于 2009-12-15
到了Item18,就进入了第四章:Designs and Declarations (其实应该再加上“of Interfaces”)。看到标题我猜想接下来应该都是些大话了吧@#¥%
因为接口(interface)在C++中泛滥成灾,Scott认为应该认真设计这些接口,使得它们:很易用对,很难用错。
用错的可能有:
-
调用接口时输入了错误的参数。书中有给出例子(一个接受年、月、日为参数的接口函数,用户可以轻易给出各种错误的输入),以及解决办法:用对象来约束参数输入的范围(不接受简单的整数作为输入,而是Date、Mon、Year对象)
-
用常规的用法调用“特别”设计的接口。所以需要尽可能的把自己的设计往常规上靠:数据对象的行为要尽可能符合内建对象(比如int)的行为;接口的名字和意义要尽可能一致(比如STL中的容器基本都有一个叫做size的返回容器大小的接口)……这样做鼓励用户去正确的看待和使用你的接口。
-
忘了处理调用接口后的遗留问题。因此不要让用户去“记得”做一些事情。比如说设计一个接口返回一个指向某新建对象的指针,这样做的结果就是该接口的用户需要“记得”去释放这个指针所指的对象:如果用户忘了释放或释放了好几次,后果就是@#¥%
解决的办法之一是让该接口返回一个智能指针(嗯……印象模糊了?去看Item14),这样用户用完了就可以“忘记”这个指针:它自己会处理后事。
-
所谓的“跨DLL问题”(cross DLL problem):在一个DLL中new一个对象,然后对象被传到另外一个DLL里被delete。大师推荐用shared_ptr因为它解决了这个问题。
以上问题的解决也是有代价的:额外对象的创建和销毁需要时间空间。比如boost的shared_ptr就是普通指针的两倍大小,还有额外的对象操作时间+过程动态内存分配等。应了那句老话:有所得必有所失。实际上有些底层代码根本没这个资本提供这样的“豪华装备”,不过有这样的思想还是很重要D……