C++ 中不容忽视的API 错误设计

  对于许多C ++开发人员来说,API设计可能会在其优先级列表中排名第3或第4。大多数开发人员都倾向于使用C ++来获得原始功能和控制权。因此,性能和优化的想法占据这些开发者的时间的百分之八十。


  当然,每个C ++开发人员都会考虑头文件设计的各个方面,但是API设计不仅仅是头文件设计那样。事实上,我强烈建议每一个开发人员在其API的设计上,无论是面向公共还是面向内部,都给予一些帮助,因为这样可以节省你大量的维护成本,提供平滑的升级路径,并为你的客户节省麻烦。


  下面列出的许多错误都是我自己的经验和我从Martin Reddy的精彩书籍《C ++ API Design》(我强烈推荐的书)中学到的东西的结合。如果你真的想要深入了解C ++ API设计,那么你应该阅读Martin Reddy的书,然后使用下面的列表作为更多的清单来强制执行代码审查。

错误#1:不将你的API放在命名空间中

为什么这是一个错误?

  因为你不知道将使用哪个代码库,特别是对于外部API。如果不将API功能限制在命名空间中,则可能导致与该系统中使用的其他API发生名称冲突。


例如:让我们考虑一个非常简单的API和使用它的客户端类:

//API - In Location.h
class vector
{
public:
  vector(double x, double y, double z);
private:
  double xCoordinate;
  double yCoordinate;
  double zCoordinate;
};
//Client Program
#include "stdafx.h"
#include "Location.h"
#include <vector>
using namespace std;
int main()
{
  vector<int> myVector;
  myVector.push_back(99);
  return 0;
}


  如果有人试图在同时使用std::vector的项目中使用这个类,他们会得到一个错误:
   “error C2872: ‘vector’: ambiguous symbol”
这是因为编译器无法决定客户端代码引用的向量是std::vector还是location.h中定义的vector对象。


如何解决这个问题?


始终将API放在自定义命名空间中,例如:

//API
namespace LocationAPI
{
  class vector
  {
  public:
    vector(double x, double y, double z);
  private:
    double xCoordinate;
    double yCoordinate;
    double zCoordinate;
  };
}


  另一种方法是为所有公共API符号添加一个唯一的前缀。如果遵循此约定,我们将调用我们的类“lvector”而不是“vector”。此方法用于OpenGL和QT。


  在我看来,如果你正在开发纯C的API,这是有道理的。确保所有公共符号符合此唯一命名约定是另一个令人头痛的问题。如果你正在使用C ++,那么你应该只在命名空间中对API功能进行分组,让编译器为你完成繁重的任务。


  我还强烈建议你使用嵌套命名空间来进行功能分组或将公共API与内部API分开。一个很好的例子是Boost库,它们可以自由地使用嵌套的命名空间。例如,在根“boost”命名空间内,boost :: variant包含Boost Variant API的公共符号,boost :: detail :: variant包含该API的内部详细信息。

错误#2:在你的公共API头的全局范围中包含“using namespace”

为什么这是一个错误?


  这将导致被引用命名空间中的所有符号在全局命名空间中变得可见,并首先抵消掉使用命名空间的好处。


另外:

  • 头文件的使用者不可能撤消命名空间包含,因此他们被迫使用决策来使用你的命名空间,这是不可取的。
  • 它极大地增加了命名空间首先要解决的冲突的可能性。
  • 当引入新版本的库时,程序的工作版本可能无法编译。如果新版本引入的名称与应用程序正在从另一个库使用的名称冲突,则会发生这种情况。
  • 代码中的“using namespace”部分从包含头部的代码中出现的那一点开始生效,这意味着在此之前出现的任何代码都可能与该点之后出现的任何代码区别对待。


如何解决这个问题?

  • 1.尽量避免在头文件中放置任何使用的命名空间声明。如果你需要一些名称空间对象来编头文件,请在头文件中使用完全限定名称(例如std :: cout,std :: string)。
//File:MyHeader.h:
class MyClass
{
private:
    Microsoft::WRL::ComPtr _parent;
    Microsoft::WRL::ComPtr _child;
}

  • 2.如果上面的建议#1导致代码混乱太多 - 将“using namespace”用法限制在头文件中定义的类或命名空间内。 另一个选择是在头文件中使用范围别名,如下所示。

    //File:MyHeader.h:
    class MyClass
    {
    namespace wrl = Microsoft::WRL; // note the aliasing here !
    private:
    wrl::ComPtr _parent;
    wrl::ComPtr _child;
    }

    有关与C ++头文件相关的其他问题,请参阅帖子“十大C ++头文件错误以及如何修复它们”(https://www.acodersjourney.com/top-10-c-header-file-mistakes-and-how-to-fix-them/)。




more to read at https://mp.weixin.qq.com/s/Yyno5VNHr88BaQvMoZafVA

原文地址:https://blog.51cto.com/14351872/2399858

时间: 2024-11-01 18:42:38

C++ 中不容忽视的API 错误设计的相关文章

关于API的设计与实现

http://blog.csdn.net/horkychen/article/details/46612899 API的设计是软件开发中一个独特的领域.最主要的特殊点在于API是供开发者使用的界面,即Application Programmer Interfaces.类似于用户可以直接使用到的GUI的作用一样.所以相对于依据软件设计的原则,考虑用户的”体验”会更加重要. 许多著名的工具和库的作者都写过相关的著作,详细的论述他们在API上的设计与实现要点.下面的论述,就是从这些前人的工作成果中总结

API的设计与实现

关于API的设计与实现 API的设计是软件开发中一个独特的领域.最主要的特殊点在于API是供开发者使用的界面,即Application Programmer Interfaces.类似于用户可以直接使用到的GUI的作用一样.所以相对于依据软件设计的原则,考虑用户的"体验"会更加重要. 许多著名的工具和库的作者都写过相关的著作,详细的论述他们在API上的设计与实现要点.下面的论述,就是从这些前人的工作成果中总结而来.以下先列出参考资料: 1.软件框架设计的艺术 (Jaroslav Tul

从涂鸦到发布——理解API的设计过程(转)

英文原文:From Doodles to Delivery: An API Design Process 要想设计出可以正常运行的Web API,对基于web的应用的基本理解是一个良好的基础.但如果你的目标是创建出优秀的API,那么仅凭这一点还远远不够.设计优秀的API是一个艰难的过程,如果它恰巧是你当前的工作任务,那么你很可能会感到手足无措. 不过,优秀的设计绝对是可以实现的.本文所描述的流程将帮助你获得成功,我们将共同研究什么是优秀的设计,以及迭代式的流程如何帮助我们实现这一目标.我们还将叙

RESTful API的设计原则

最近一直在做公司的一个API平台的项目,前后大约有半年多了,中间穿插了好多其他的项目一起做的.上周经理要求写文档,我就重新打开项目开始检阅之前的代码,发现好多地方当初设计的并不合理,忽然就想到,一个好的API平台,应该怎么来设计呢?有哪些规范要遵守呢?面对自己的项目,感觉好多地方都要改,但是已经有人在用了,怎么办?全都要改动吗?所以就上网找解决方案,然后就发现一精品贴,现转载过来,以备不时查阅. 原文地址:http://www.cnblogs.com/moonz-wu/p/4211626.htm

Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)

文章目录:                   1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Application 有何妙用: 5. MJ0011 关于 Native Application 的文章整理: 6. 互联网上其他关于 Native Application 的文章整理: 7. 小结: 1. 引子: 其实在好久以前就看了 MJ0011 翻译的那个<Native 应用程序详细>系列的文

在VBA中使用Windows API

VBA是一种强大的编程语言,可用于自定义Microsoft Office解决方案.通过使用VBA处理一个或多个Office应用程序对象模型,可以容易地修改Office应用程序的功能或者能够使两个或多个Office应用程序协同工作以完成单个应用程序无法完成的任务.然而,使用VBA仅能控制操作系统的一小部分.Windows API提供了控制操作系统绝大多数方面的功能.下面,介绍在VBA中使用Windows API的一些知识. 理解APIs API只是一组函数,可用于处理组件.应用程序或操作系统.通常

好RESTful API的设计原则

说在前面,这篇文章是无意中发现的,因为感觉写的很好,所以翻译了一下.由于英文水平有限,难免有出错的地方,请看官理解一下.翻译和校正文章花了我大约2周的业余时间,如有人愿意转载请注明出处,谢谢^_^ Principles of good RESTful API Design 好RESTful API的设计原则 Good API design is hard! An API represents a contract between you and those who Consume your da

atitit.基于http json api 接口设计 最佳实践 总结o7

atitit.基于http  json  api 接口设计 最佳实践 总结o7 1. 需求:::serverand android 端接口通讯 2 2. 接口开发的要点 2 2.1. 普通參数 meth,param, 2 2.2. 全部的參数定义 2 2.3. key,dynami key)韩式 static key? 2 2.4. 防篡改 sign 2 2.5. Encry加密 3 2.6. zip压缩:: 3 2.7. 首先压缩韩式加密??? 3 3. 选型大全:rim ,ws, http 

Web API接口设计(学习)

1.在接口定义中确定MVC的GET或者POST方式 由于我们整个Web API平台是基于MVC的基础上进行的API开发,因此整个Web API的接口,在定义的时候,一般需要显示来声明接口是[HttpGet]或者[HttpPost],虽然有些接口也可以不用声明,但是避免出现类似下面的错误信息,显式声明还是有好处的. 请求的资源不支持 http 方法“POST 例如在基类定义的查找对象接口如下所示. /// <summary> /// 查询数据库,检查是否存在指定ID的对象 /// </su