怎样设计接口?

怎样设计接口?

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

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://www.cnblogs.com/hrhguanli/p/3952906.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程心理学之9----乙方如何面对甲方2

(本文同步发布在javaeye.com上,转载请保留出处) 在http://www.cnblogs.com/jackyrong/archive/2006/11/08/554694.html中, 大概谈了下如何应对甲方的领导。这次要谈的就是很重要的如何应对甲方的信息项目的负责人了。这其实也是相当重要的一部分,在打通了和甲方领导…

input禁止输入的方法

1&#xff1a; readonly规定输入字段为只读可复制&#xff0c;但是&#xff0c;用户可以使用Tab键切换到该字段&#xff0c;可选择,可以接收焦点&#xff0c;还可以选中或拷贝其文本。 <input type"text" value"哈哈哈" readonly"readonly"&g…

linux下gdb常用的调试命令

From: http://blog.csdn.net/schoolers/article/details/6743223 用gdb调试程序时&#xff0c;常常很困惑一些命令的使用&#xff0c;要么是不知道这个命令&#xff0c;要么忘了命令的使用方法。 呵呵&#xff0c;有时迷茫了自己处在什么堆栈的深处&#xff0c;这是使用where命…

JS之返回字符串最后出现的位置lastIndexOf

作用&#xff1a;lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置&#xff0c;在一个字符串中的指定位置从后向前搜索 语法&#xff1a;stringObject.lastIndexOf(searchvalue,fromindex) 参数1&#xff1a;必需。规定需检索的字符串值 参数2&#xff1a;可选的整…

博客园访问量有些小,我就没有必要在复制一份了,博客园就这样吧,继续CSDN了。...

博客园访问量有些小&#xff0c;我就没有必要在复制一份了&#xff0c;博客园就这样吧&#xff0c;继续CSDN了。转载于:https://www.cnblogs.com/Silence-AC/p/3953046.html

死循环-批处理

echo off:loopstart cmd.exegoto :loop注&#xff1a;其中 &#xff1a;loop为循环标记cmd.exe程序可以更换为其他程序如你的电脑性能好的话可以用shutdown -a来结束转载于:https://blog.51cto.com/aizzw/101246

基于mint-ui的城市选择3级联动

1、实际效果 2、首先你需要去下载一个包含中国省份&#xff0c;城市&#xff0c;区县的数据 如下&#xff1a; https://github.com/artiely/Administrative-divisions-of-China&#xff08;里面包含二级联动数据&#xff0c;三级联动数据&#xff0c;四级联动数据等&#xff0…

JS之检索子字符串的search方法

作用&#xff1a;search() 方法用于检索字符串中指定的子字符串&#xff0c;或检索与正则表达式相匹配的子字符串 语法&#xff1a;stringObject.search(regexp) 参数&#xff1a;该参数可以是需要在 stringObject 中检索的子串&#xff0c;也可以是需要检索的 RegExp 对象。…

React开发(122):动态表头核心配置 外层绑定key

Object.keys()的用法 作用&#xff1a;遍历对象 返回结果&#xff1a;返回对象中每一项key的数组 // 1. 定义一个对象var obj { 0:大,1:二,2:光强 }// 2. 使用Object.keys()方法var keyValue Object.keys(obj)// 3. 打印结果console.log(keyValue) // 得到是&#xff1a;[&q…

一个很有深度的C++内存问题---GDB调试(一)

先看代码(a.c)&#xff1a; #include <stdio.h>int main(int argc, char* argv[]){int a[4]{1,2,3,4};int *ptr1(int*)(&a1);int *ptr2(int*)((int)a1);int *ptr3(int*)(a1);printf("a %x, &a %x, &a1 %x, (int)a1 %x\n", a, &a, &a1…

咬文嚼字——1

看点&#xff1a;作者王琦 勘误&#xff1a;张琦等编著 出处&#xff1a;永正网上购书中心 [url]http://www.erbook.com.cn/list.asp?sp_code9787121067921[/url] 《案例精解企业级网络构建》六位主创人员博客地址&#xff1a; 张琦&#xff1a; [url]http://zhangqi.blog.51…

HTML DOM之属性的各种操作方法

1.element.getAttribute(attributename)方法用来返回指定属性名的属性值&#xff0c;返回的类型是字符串类型 2.element.getAttributeNode(attributename)方法从当前元素节点(nodeType值为1的节点)element中通过名称获取属性节点(nodeType值为2的节点)&#xff0c;返回值是指定…

input框在ios中的阴影问题

在IOS下&#xff0c;input 和textarea表单默认会有个内阴影&#xff0c;一定程度上影响视觉一致&#xff0c;可通过设置下面代码去掉&#xff1a; input{ -webkit-appearance: none; }

React开发(123):ant design学习指南

// 表单组件<Form><Button><Input><InputNumber> //所有输入数字的地方要使用此组件 <Radio><Select><DatePicker><TreeSelect>// 数据展示|布局组件<Card><Tabs><Table>//反馈交互组件<Modal><…

40种网站设计常用方法

1. οncοntextmenu"window.event.returnValuefalse" --将彻底屏蔽鼠标右键<table border οncοntextmenureturn(false)><td>no</table> 可用于Table2. <body onselectstart"return false"> 取消选取、防止复制3. οnpaste"…

无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用

一&#xff0c;问题描述 MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain16&#xff0c;该符号在函数 ___tmainCRTStartup 中被引用 Debug\jk.exe : fatal error LNK1120: 1 个无法解析的外部命令 error LNK2001: unresolved external symbol _WinM…

常见位操作:获取,设置,清零

1 /*常见位操作&#xff1a;获取&#xff0c;设置&#xff0c;清零2 * 3 * */4 public class BitGet {5 /*6 * 该函数实现获取功能7 * 先将1左移动i位&#xff0c;左移动0位变成了00000001&#xff0c;8 * 然后再和Num十进制12转化为二进制00001100进行&a…

CSS Grid布局(2)

6.间距 grid-column-gap和grid-row-gap属性用来创建列与列&#xff0c;行与行之间的间距 间距(Gap)可以设置任何非负值&#xff0c;长度值可以是px、%、em等单位值 grid-gap是grid-row-gap和grid-column-gap两个属性的缩写 如果它指定了两个值&#xff0c;那么第一个值是设置…

linux怎么使多条命令同时执行

一次执行多个bai命令可以将多个命令用du英文分号分割&#xff0c;比如像这样&#xff1a;zhi mkdir /tmp/mydir; touch /tmp/mydir/myfile 其实这样也倒不能算是同时执行&#xff0c;Linux的命令是顺序执行的&#xff0c;就算是shell脚本&#xff0c; 里面写了一大堆命令&#…