怎样设计接口?

怎样设计接口?

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

怎样设计接口?

    众所周知,接口是提供给其它模块或者系统使用的一种约定或者规范。因此接口必需要保
证足够的稳定性和易用性。这是设计接口的基本要求。

1.稳定性

    接口必须相对稳定,否则将导致接口的使用者和提供者为了适应新接口而不断改动接口
的实现,可能反复进行无用功,严重时影响整个软件开发进度。那么怎样保证设计的接口相
对稳定呢?
    首先,接口的语义必须明白。包含接口调用方法、接口名称、參数的类型和名称。抽象
的接口名称或者參数名称使人困惑或者理解错误。例如以下例:
    History::SetAttribute
    设置历史记录的属性,初看不知道该接口要做什么。除非History的属性非常多否则没有
必要设计这种接口。
    ioctl
    C库中的ioctl,事实上非常难用原因是须要设置项太多,每一个项的參数又不太一致,接口使
用者的压力就较大了。可是接口设计者也是不得已而为之,因为IO的设置接口的应用情况较
多,假设每一个设置接口都单独提供一个接口则会导致非常多的接口,另外就是保证接口的相
对稳定,採用抽象的数据的接口便于移植和稳定。
    因此,明白的接口语义例外情况就是就是对于辅助功能,假设须要较多接口,则能够合
成一个接口,採用不同參数区分(如windows中的窗体处理过程类型的定义也是这种情况)。
    其次,採用版本号定义来区分接口的差异。比方提供接口版本号查询功能,接口实现着提供
接口版本号的查询功能。

2.易用性

    接口是提供给第三方使用的,较难用的接口会导致接口使用者的抱怨。
    如:
        SetCookie(void* handle, const CookieParam& param);
        GetCookie(void* handle, CookieParam& param);
    此接口名称的意义还是比較明白的,可是參数CookieParam过于抽象,将导致接口的调用
者在使用接口时,须要将基本数据类型的值组成一个CookieParam类型,然后才干调用接口。
这是一种糟糕的接口设计。既不便于使用又不便于编译器优化(待确认)。
    假设该为以下的接口则较easy使用
        SetCookie(void* handle, const URL& url, const String& cookie);
        GetCookie(void* handle, const URL& url, String cookie);
    除非接口的參数个数超过5个,否则最好採用基本数据类型作为參数。超过5个參数的函数
一方面给调用者带来困难,參数排列组合的情况过多,还有一方面就是不利于编译器优化时採用
寄存器传递參数。

3.怎样设计接口?

    採用OOD思想,即面向对象的思想,提供类接口或者COM接口。
    对于C函数接口怎样设计呢?事实上和C++接口设计原则一样,也採用面向对象的思想,仅仅是
将类设计成结构,公共的成员函数变为全局的函数,私有的成员函数变为static函数就可以。
函数接口的第一參数就相当于C++中的this指针就可以。

4.接口设计的其它要求

    * 规范性:主要是接口设计的代码规范,这是最主要的要求。同一时候考虑C接口命名污染的
              问题。一般C接口都会在接口前加上公司或者模块的标识。
    * 可移植性:对于须要在多平台实现的接口须要考虑接口本身的可移植性,因此最少使用
                对于系统依赖的类型作为接口的參数类型或者返回值类型。
    * 鲁棒性:接口须要有适度的鲁棒性,主要是指可以在多种情况下接口都能实现统一的效
              果,不会随着调用者传入的參数的变化而导致接口的输出出现违背接口语义的
              情况出现。
    * 安全性:接口定义时须要严格限制參数的读写权限,假设仅仅能是仅仅读的參数一定要设置
              成const,以免出现非法使用。
    * 兼容性:这是接口扩充的原则,必须保证同一个接口实现后向兼容前一版本号的使用。扩
              充的同类接口也能兼容老接口的实现。

5.怎样扩展接口 

    1.採用版本号特性,不同版本号的接口实现能够同意有差异,可是提供版本号查询功能;
    2.序号表示新增的接口,如SetCookie、SetCookie1、SetCookie2

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118311.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 操作系统中并发和并行的区别在于_线程是并行还是并发

    操作系统中并发和并行的区别在于_线程是并行还是并发一、教材解释:·并行是指两个或者多个事件在同一时刻发生,而并发是指两个或者多个事件在同一时间间隔发生·并行是在不同实体上的多个事件,并发是在同一实体上的多个事件二、c语言站长公众号解释:1、并发早期计算机的CPU都是单核的,一个CPU在同一时间只能执行一个进程或线程,当系统中有多个进程或线程等待执行时,CPU只能执行完一个再执行下一个。计算机在运行过程中,有很多指令会设计i/o操作,而i/o操作又是相当耗时间的,速度远远低于CPU,这导致CPU经常处于空闲状态,只能等待i/o操作完成

    2025年6月9日
    0
  • c语言中的双周期指令,时钟周期 机器周期 指令周期的概念[通俗易懂]

    c语言中的双周期指令,时钟周期 机器周期 指令周期的概念[通俗易懂]时钟周期:时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12us),是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。对于某种单片机,若采用了1MHZ的时钟频率,则时钟周期为1us;若采用4MHZ的时钟频率,则时钟周期为250us。由于时钟脉冲是计算机的基本工作脉冲,它控制…

    2022年10月13日
    0
  • resnet50代码详解_一张图看懂系列

    resnet50代码详解_一张图看懂系列直接上流程图,算法很清晰。仅包括卷积层和全连接层,不包括池化层,正好50层。相比于ResNet_50,ResNet_101就是在上图第3个大虚线框多了17个bottleneck,17*3+50=101,说白了就是将下图复制17个加入上图的第3个大虚线框内:画图不易,转载请注明出处!…

    2022年10月6日
    0
  • atitit.获取北京时间CST 功能api总结 O7

    atitit.获取北京时间CST 功能api总结 O7

    2022年1月23日
    48
  • 为什么执行不了程序_电脑软件无法执行代码怎么办

    为什么执行不了程序_电脑软件无法执行代码怎么办程序为什么不执行?

    2022年4月22日
    113
  • FPGA之ODDR「建议收藏」

    通过oddr把两路单端的数据合并到一路上输出上下沿同时输出数据上沿输出a路下沿输出b路 如果两路输入信号一路恒定为1,一路恒定为0,那么输出的信号实际上就是输入的时钟信号ODDRPrimitive:Adedicatedoutputregistertotransmitdualdatarate(DDR)signalsfromV

    2022年4月7日
    147

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号