提供对外接口时,要注意的地方

本篇仅是个人经验的总结,以及自己的看法。欢迎指正和讨论。

在实际工作中,如果你提供的接口,需要被下游多个部门依赖。那么,在接口设计的时候就一定要考虑一个问题:如何在给其他人提供接口后,增加或优化自身代码时,不会束手束脚?

以下是我的一些实际经验:

1. 对外不要直接提供实现功能的类,而是提供对应的接口类和一个创建/删除对象的函数

例如,对外提供三种图形(省略构造和析构函数):

// 反例
class Shape
{
public:virtual void Draw() = 0;
};class Square : public Shape
{
public:virtual void Draw();
private:...
};class Rect : public Shape
{
public:virtual void Draw();
private:...
};class Circle : public Shape
{
public:virtual void Draw();
private:...
}

建议修改为这样

class Shape
{
public:virtual void Draw() = 0;
};enum SHAPE{
Squre,
Rect,
Circle
};Shape* createShape(SHAPE SH);
void DestructShape(Shape* sp);

对外展示的东西越少,自己可以操作的东西就越多。这也是我们为什么强调封装的重要性。
如果提供Shape接口的是个平台部门,那么如果修改Circle的一个bug时,必须在Circle中增加一个方法,那么,如果使用第一个头文件,则所有使用此头文件的部门,都需要重新编译代码。平台修改问题,还需要其它部门重新编译,本身就不是个好的设计;如果使用第二种方法,则仅需要编译Shape相关代码并重新链接一下。

2. 对外的接口,仅提供能满足需求的最小功能

同理,对外展示的东西越少,自己可以操作的东西就越多。如果我们提供了多余的功能,今后在做优化或裁减的时候,这部分本来多余的东西,还需要下游部门的配合才可以裁减掉,想想就头痛。

3. 接口中尽可能使用 “const”

const的好处太多了,可以参考Meyers的Effective C++。
在这里,我仅想补充一个我遇到的好处:
做单元测试的时候,如果接口的参数是const,那就表明这个参数是个单纯的入参,校验UT的结果时,可以不用校验这个入参;如果接口方法是const,则表明此方法不会修改类成员,因此校验UT结果时,可以不用考虑类的成员。

4. 不要返回类成员的引用或指针(不要使用全局变量)

本条建议也包括,不要把类成员定义成public或protected。
撇开外部可以直接修改对象成员这么大的劣势不说。从另一个角度看,对外展示过的东西,可没那么好修改。如果修改成员的类型(比如从short修改为int),使用此接口的地方会有多少编译错误啊。编译错误还好办,如果有人使用“<<”或“>>”这种流操作,那么就相当于埋下了个雷,什么时候会炸呢?

5. 多考虑一下拷贝构造和拷贝赋值

如果对外的接口中,不得不提供非抽象类,那么请多考虑一下拷贝构造和拷贝赋值。(禁止还是重写)

提供对外接口时,要注意的地方相关推荐

  1. IDL中提供的[source]属性,是为了让实现类宣扬它支持哪几个对外接口注册。

    IDL中提供的[source]属性,是为了让实现类宣扬它支持哪几个对外接口注册. 主要表达的意思的是--组件内部在某种条件下将调用该接口,向外界传递信息.如果你对此信息感兴趣,就要自己实现这个接口,并 ...

  2. 将B/S程序打包成exe,C#对外提供http接口,CefSharp 修改浏览器默认白色背景

    简介 公司有个项目,需要将我们https的B/S程序集成到的http的B/S程序中,还要保持本身功能完整,由于https程序中需要调用电脑的麦克风和摄像头,这就难受了.最后商量决定将https程序制作 ...

  3. 如何设计一个安全的对外接口?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | kks.me/b3fTJ 最近有个项目需要对外提供一个接 ...

  4. 其他系统 对外接口设计_领导:项目有个接口要对外开放,小张你来设计一下?...

    前言 最近有个项目需要对外提供一个接口,提供公网域名进行访问,而且接口和交易订单有关,所以安全性很重要:这里整理了一下常用的一些安全措施以及具体如何去实现. 安全措施 个人觉得安全措施大体来看主要在两 ...

  5. 其他系统 对外接口设计_外观模式:统一接口 VS.暴露细节

    什么是接口--java语言中的接口 Java类中定义的所有public型的方法都可以被简单地视为该类对外提供的接口. 抽象类中public型的抽象方法,可以被看成是整棵继承树的对外接口. 对于Java ...

  6. Effective C# 原则22:用事件定义对外接口(译)

    Effective C# 原则22:用事件定义对外接口 Item 22: Define Outgoing Interfaces with Events 可以用事件给你的类型定义一些外部接口.事件是基于 ...

  7. Java简单的对外接口验签

    对外接口,需要校验一下是否有相应权限,简单的一个小代码. res加密util: /*** @description: AES加密解密工具* @author:mic* @create: **/ publ ...

  8. Unity3D调用Android提供的接口

    需求:Android提供相关的接口,android只提供接口,没有相关的界面,android接口打包以jar包的形式供Unity3D调用 1.编写相关的android接口 在studio中新建工程,并 ...

  9. java对外接口 入参实体命名_支付中心接口设计之参数命名

    目前,java版支付中心处在研发阶段.下午,特有钻研精神的云龙同学饶有兴趣的问我"战哥,你觉得表字段用哪种命名方式比较好呢?" 所用的db是mysql,他是想征求一下我的看法,是用 ...

最新文章

  1. 快手,字节面试题,将IP地址转换成整数类型,再转换回来。C++代码
  2. 微软 CTO 韦青:对微软这样已经走过44年的公司,现在也只是个小小小的开始!!!
  3. Boost:系统测试的实例
  4. 南山中学2021级2班高考成绩查询,绵阳南山中学双语学校2021年排名
  5. 双盘转子动力学仿真c语言程序,递归牛顿欧拉(正)动力学仿真
  6. 漫步凸分析三——凸集代数
  7. rx2700_第二代锐龙 7 2700X 台式处理器 | AMD
  8. Gitee 上线多项 PR 功能优化,进一步提升审查与提交效率
  9. 关于专注,关于最近的一些事情
  10. Java SE 01 Java概述
  11. 网吧服务器系统安装,网吧服务器和客户端安装教程
  12. Flask开发 导入flask_uploads包时提示“IMPORTERROR: CANNOT IMPORT NAME ‘SECURE_FILENAME‘ FROM ‘WERKZEUG‘“
  13. 灵活有效的激励手段-鲶鱼效应
  14. 服务器背板电源维修,814835-B21 814832-001 DD-2901-3C-LF G9 HPE服务器电源背板
  15. 《数据结构课程设计》实验预习
  16. SHA-3标准(NIST.FIPS.202)阅读笔记
  17. Numpy库的三种矩阵乘法
  18. 无耻,无知的韩国人!
  19. uml图六种箭头的含义(泛化、实现、依赖、关联、聚合、组合)
  20. 解决移动硬盘可以识别,但不显示盘符的问题

热门文章

  1. 全民奇迹修复云服务器跨服,传送受限攻防逆转 全民奇迹跨服那些事儿
  2. 【03】Chrome提示印象笔记剪藏插件已停用不支持的扩展程序怎么办?
  3. 脉冲雷达数据采集基础
  4. Linux命令(39):cal
  5. 全国计算机一本通app,驾考宝典一本通
  6. 我们可以从Alexa语音助手的错误中学到什么:用户对话界面的设计性挑战
  7. 蓝桥云课之新手入门指南
  8. 数组n个值切割成m段,保证m段中和值最小
  9. 十个最火的HTML5框架与移动应用框架的比较
  10. 自动化测试难?WPS的UI自动化落地方案甩给你