提供对外接口时,要注意的地方
提供对外接口时,要注意的地方
本篇仅是个人经验的总结,以及自己的看法。欢迎指正和讨论。
在实际工作中,如果你提供的接口,需要被下游多个部门依赖。那么,在接口设计的时候就一定要考虑一个问题:如何在给其他人提供接口后,增加或优化自身代码时,不会束手束脚?
以下是我的一些实际经验:
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. 多考虑一下拷贝构造和拷贝赋值
如果对外的接口中,不得不提供非抽象类,那么请多考虑一下拷贝构造和拷贝赋值。(禁止还是重写)
提供对外接口时,要注意的地方相关推荐
- IDL中提供的[source]属性,是为了让实现类宣扬它支持哪几个对外接口注册。
IDL中提供的[source]属性,是为了让实现类宣扬它支持哪几个对外接口注册. 主要表达的意思的是--组件内部在某种条件下将调用该接口,向外界传递信息.如果你对此信息感兴趣,就要自己实现这个接口,并 ...
- 将B/S程序打包成exe,C#对外提供http接口,CefSharp 修改浏览器默认白色背景
简介 公司有个项目,需要将我们https的B/S程序集成到的http的B/S程序中,还要保持本身功能完整,由于https程序中需要调用电脑的麦克风和摄像头,这就难受了.最后商量决定将https程序制作 ...
- 如何设计一个安全的对外接口?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | kks.me/b3fTJ 最近有个项目需要对外提供一个接 ...
- 其他系统 对外接口设计_领导:项目有个接口要对外开放,小张你来设计一下?...
前言 最近有个项目需要对外提供一个接口,提供公网域名进行访问,而且接口和交易订单有关,所以安全性很重要:这里整理了一下常用的一些安全措施以及具体如何去实现. 安全措施 个人觉得安全措施大体来看主要在两 ...
- 其他系统 对外接口设计_外观模式:统一接口 VS.暴露细节
什么是接口--java语言中的接口 Java类中定义的所有public型的方法都可以被简单地视为该类对外提供的接口. 抽象类中public型的抽象方法,可以被看成是整棵继承树的对外接口. 对于Java ...
- Effective C# 原则22:用事件定义对外接口(译)
Effective C# 原则22:用事件定义对外接口 Item 22: Define Outgoing Interfaces with Events 可以用事件给你的类型定义一些外部接口.事件是基于 ...
- Java简单的对外接口验签
对外接口,需要校验一下是否有相应权限,简单的一个小代码. res加密util: /*** @description: AES加密解密工具* @author:mic* @create: **/ publ ...
- Unity3D调用Android提供的接口
需求:Android提供相关的接口,android只提供接口,没有相关的界面,android接口打包以jar包的形式供Unity3D调用 1.编写相关的android接口 在studio中新建工程,并 ...
- java对外接口 入参实体命名_支付中心接口设计之参数命名
目前,java版支付中心处在研发阶段.下午,特有钻研精神的云龙同学饶有兴趣的问我"战哥,你觉得表字段用哪种命名方式比较好呢?" 所用的db是mysql,他是想征求一下我的看法,是用 ...
最新文章
- 快手,字节面试题,将IP地址转换成整数类型,再转换回来。C++代码
- 微软 CTO 韦青:对微软这样已经走过44年的公司,现在也只是个小小小的开始!!!
- Boost:系统测试的实例
- 南山中学2021级2班高考成绩查询,绵阳南山中学双语学校2021年排名
- 双盘转子动力学仿真c语言程序,递归牛顿欧拉(正)动力学仿真
- 漫步凸分析三——凸集代数
- rx2700_第二代锐龙 7 2700X 台式处理器 | AMD
- Gitee 上线多项 PR 功能优化,进一步提升审查与提交效率
- 关于专注,关于最近的一些事情
- Java SE 01 Java概述
- 网吧服务器系统安装,网吧服务器和客户端安装教程
- Flask开发 导入flask_uploads包时提示“IMPORTERROR: CANNOT IMPORT NAME ‘SECURE_FILENAME‘ FROM ‘WERKZEUG‘“
- 灵活有效的激励手段-鲶鱼效应
- 服务器背板电源维修,814835-B21 814832-001 DD-2901-3C-LF G9 HPE服务器电源背板
- 《数据结构课程设计》实验预习
- SHA-3标准(NIST.FIPS.202)阅读笔记
- Numpy库的三种矩阵乘法
- 无耻,无知的韩国人!
- uml图六种箭头的含义(泛化、实现、依赖、关联、聚合、组合)
- 解决移动硬盘可以识别,但不显示盘符的问题