接口 (信息技术)
“interface”的各地常用译名 | |
---|---|
中国大陆 | 界面、接口 |
台湾 | 介面 |
港澳 | 界面、介面 |
接口(英语:interface),又译介面,是泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其交互的方式,就如面向对象编程提供的多重抽象化。
接口是两实体交换资料的介质,交换资料的实体可以是软件、电脑硬件、外部设备、人等等[1]。有些接口(例如触摸屏)是双向的,可以发送信息,同时接收信息,有些接口(例如鼠标或喇叭)则是单向的,只能发送或接收信息[2]。人类与电脑等信息机器或人类与程序之间的接口称为用户界面。电脑等信息机器硬件组件间的接口叫硬件接口。电脑等信息机器软件组件间的接口叫软件接口。
接口可能也提供某种意义上的在讲不同语言的实体之间的翻译,诸如人类与电脑之间。因为接口是一种间接手段,所以相比起直接沟通,会引致些额外负担。
硬件接口
[编辑]硬件接口为电脑等的信息机器的硬件之间通信时的物理连接器形状、发送接收信号的方法(协议)等等的规格。主要可分为并行链接的和比特序列链接的。序列链接者相比起并行链接者,多得多使用同一电线作为信号控制线和电源供应线。个人电脑领域,因并行链接向更高传输速度的发展遇到瓶项,而在向各接口的序列链接方式迁移(参看总线)。
软件接口
[编辑]软件接口可能会指不同层次上的各种接口:操作系统和硬件之间会有接口、电脑上运行的应用程序或计算机程序需要有接口来处理字符串流、过滤器及管道[3]、在面向对象程序设计中,应用程序中的对象会透过方法来和外面交互,这也是一种接口[4]。而软件间通信时传递消息(message)的规格、进程间通信或电脑网络也都有接口的特性。
软件实务上
[编辑]在程序设计时的一个基本原则是:所有的资源默认都是不允许直接访问的,只允许透过有良好定义的接口来访问[5]。软件接口提供可以访问电脑系统中资源(例如存储器、CPU、存储设备)的方式。若软件没有透过界面访问资源,而是直接访问相关资源,对机能以及稳定性都会造成不良的(而且可能是灾难性的)后果[来源请求]
软件模块中的接口会提供常量、数据类型、子程序的类型、异常处理规格、以及类型特征。有时接口中也会定义公共变量[6]。
软件模块A的接口会刻意的和模块的实现分开定义。模块的实现会包括要有关接口的模块以及接口的实际代码,也包括模块中的私有程序及方法。另一个软件模块 B,假设是软件模块A的客户端,需通过公开提供的接口才能访问软件模块A。这样安排在实务的好处是:若将软件模块A的实现方式改成其他方式,但接口不变,软件模块B仍然可以访问软件模块A,软件模块A实现接口的作法不会影响B,这就是关注点分离,只关注接口的规格(也可以引用里氏替换原则)[来源请求]。
面向对象语言中的接口
[编辑]在一些面向对象程序设计语言中(特别是没有完整多重继承的语言),会用“接口”来定义没有资料,只有方法的抽象资料类型,以此为方法的签名(signatures)。任一个具有程序及资料的类 (计算机科学),只要有“接口”中所有的方法,就是“实现”此一接口[7]。而且,就算在单一继承语言中,也可以实现多个接口,因此可以同时“符合”多种类型[8]。
接口是数据类型的定义:对象可以改变其类型(例如子程序或方法调用中),方式是用其所实现的接口或基底类,而不是直接列出具体的类。因此所有实现这个接口的类都可以使用[来源请求]。例如在最终实现之前,可以用虚设代码来让软件开发得以进行。另外,在测试驱动开发中,可以在测试过程中用mock对象来取代实际的对象,这类的桩实现会在后续开发中,再改为真正实现的代码。
一般而言,接口中的方法没有实际的代码,因此无法执行。若要执行,需要由非抽象的类别实现其接口,让方法有实际的代码,才能执行[来源请求]。例如一种称为Stack
的接口需要支持两种方法:push()
and pop()
。可以用不同的方式来实现,例如FastStack
及GenericStack
,第一个可能是快速的,其数据结构是固定长度的,第二个的数据结构其长度可以调整,不过速度较慢。
接口可能会包括许多方法,不过也有可能只有一种方法,甚至完全没有方法。例如Java语言定义了接口Readable
,只有一个read()
方法:会因为不同的用途而有许多不同的实现,例如BufferedReader
、FileReader
、InputStreamReader
、PipedReader
及StringReader
。像是Serializable
等标记接口完全没有方法,是在通用处理时,用反射来提供运行时信息[9]。
接口上的程序设计
[编辑]接口的使用也可以形成一种称为“接口上的程序设计”(programming to the interface)的程序设计风格。此作法背后的概念是将程序的逻辑以其对象的接口来呈现,而不是内部实现的细节。接口上的程序设计可以减少和实现相关的相依性,也提高程序的复用性[10]。
控制反转是将上述概念推到极致后的一种设计原则。
用户界面
[编辑]用户界面是指人类与机器、设备、计算机程序或其他复杂工具交互的中介物的聚合。常用于电脑系统和电子设备文脉。有时也会将机械系统、交通工具或工业设备的用户界面称为人机界面(Human-Machine Interface ,缩写为 HMI)。
参看
[编辑]- 总线 (数据)
- 接口卡
- 网络接口
- 通信协议
- 抽象倒置
- 应用二进制接口(ABI)
- 应用程序接口(API)
- 商业互操作接口
- 硬盘驱动器接口
- 实现 (计算机科学)
- 继承 (计算机科学)
- 模块化编程
- 基于组件的软件工程
- 虚继承
参考资料
[编辑]- ^ Hookway, B. Chapter 1: The Subject of the Interface. Interface. MIT Press. 2014: 1–58 [2020-09-24]. ISBN 9780262525503. (原始内容存档于2020-07-29).
- ^ IEEE 100 - The Authoritative Dictionary Of IEEE Standards Terms. NYC, NY, USA: IEEE Press: 574–575. 2000. ISBN 9780738126012.
- ^ Buyya, R. Mastering Cloud Computing. Tata McGraw-Hill Education. 2013: 2.13 [2020-09-24]. ISBN 9781259029950. (原始内容存档于2020-07-29).
- ^ Poo, D.; Kiong, D.; Ashok, S. Chapter 2: Object, Class, Message and Method. Object-Oriented Programming and Java. Springer-Verlag. 2008: 7–15. ISBN 9781846289637.
- ^ Bill Venners. Leading-Edge Java: Design Principles from Design Patterns: Program to an interface, not an implementation - A Conversation with Erich Gamma, Part III. http://www.artima.com/index.jsp: artima developer. 2005-06-06 [2011-08-03]. (原始内容存档于2011-08-05).
Once you depend on interfaces only, you're decoupled from the implementation. That means the implementation can vary, and that is a healthy dependency relationship. For example, for testing purposes you can replace a heavy database implementation with a lighter-weight mock implementation. Fortunately, with today's refactoring support you no longer have to come up with an interface up front. You can distill an interface from a concrete class once you have the full insights into a problem. The intended interface is just one 'extract interface' refactoring away. ...
- ^ Patterson, D.A.; Hennessy, J.L. Computer Organization and Design: The Hardware/Software Interface 3rd. Elsevier. : 656. ISBN 9780080502571.
- ^ What Is an Interface. The Java Tutorials. Oracle. [2012-05-01]. (原始内容存档于2012-04-12).
- ^ Interfaces. The Java Tutorials. Oracle. [2012-05-01]. (原始内容存档于2012-05-26).
- ^ Performance improvement techniques in Serialization. http://www.precisejava.com/: Precise Java. [2011-08-04]. (原始内容存档于2011-08-24).
We will talk initially about Serializable interface. This is a marker interface and does not have any methods.
- ^ Gamma; Helm; Johnson; Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison Wesley. 1995: 17–18.