好的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函数
  • 对于形容词,加前缀is
  • 对于形容词应用到复数名词上的,不需要前缀
  • 动词不需要前缀,也不需要使用第三人称(即动词后不加s)
  • 名词不需要前缀(有时候防止误导需要前缀is)
对于setter函数,只要移除getter的前缀is,同时在名字前加set就可以了。
对于属性,只要移除getter的前缀is就可以了。

用枚举类型取代布尔参数




posted on 2011-11-13 00:22  chuwachen  阅读(290)  评论(0编辑  收藏  举报