好的API的六个特征
API对于程序员来说就相当于GUI对于终端用户。
最小的
每个class有尽量少的成员,有尽量少的class。
完整的
包含预期的功能。
具有清晰简单的语义
尽量让意想不到最少;解决具体的问题;当没必要的时候,不要让解决方案过度通用。直观的
能让有部分经验的用户不读文档就能开始使用;能让不了解API的程序员理解用API写的代码。容易记住的
选择一致的,准确的命名规范;使用可是别的模式和概念,避免缩写。可以让代码易读的
静态多态性
相似的class应该具有相似的API。有时候给一系列相关class提供一个相似的API要比给每一个class提供一个完美的单独的API要好。
特定于C++来说
指针vs引用
命名艺术对于输出参数,使用指针更易读。虚拟函数
如果class外没有人会调用这个函数,把这个函数定义为virtual的时候要特别小心。避免虚拟函数的原因
- 人们在重新实现虚函数的时候,在里面做些疯狂的事情:发送事件,发出信号,重新进入事件循环,删除对象
- 不能在不破坏binary compatibility的情况下添加,移动或删除虚函数
- 不容易重载虚函数
- 编译器几乎不会优化或者内联虚函数
- 调用虚函数要比调用普通函数慢2-3倍
- 虚函数使得class很难以值方式拷贝
没有虚函数的类一般bug更少并且需要更少的维护。输入参数:常量指针
常函数总是将输入指针设为常指针。返回值:指针vs常指针
返回常指针更有可能导致过度使用const_cast。
通用命名规则
不要用缩写命名class
识别一组class,而不是为每一个单独class找到完美的名字命名枚举类型和值
命名枚举值需要重复至少一个枚举类型名字中的一个单词。命名布尔型Getters, Setters和属性
对于getter函数对于setter函数,只要移除getter的前缀is,同时在名字前加set就可以了。
- 对于形容词,加前缀is
- 对于形容词应用到复数名词上的,不需要前缀
- 动词不需要前缀,也不需要使用第三人称(即动词后不加s)
- 名词不需要前缀(有时候防止误导需要前缀is)
对于属性,只要移除getter的前缀is就可以了。用枚举类型取代布尔参数