我被要求为我选择的高级OO语言编写API(我将使用Java)。当然,API需要执行特定的功能,但它们是我知道我可以完成的非常基本的事情。
我熟悉Web应用程序的API概念并且很简单,但是为OO语言编写API究竟意味着什么?在Java的情况下,这是否意味着编写一个可以导入的包并通过类/函数提供所需的功能,所以我会写a)包和b)一个单独的模块来测试它? (为了澄清,除了"编写API"以及"它需要做X,Y和Z"之外,我没有提供任何信息。进一步澄清:我提到了Web应用程序API概念只是为了表明我知道API是什么。这不是任何类型的Web API。)
答案 0 :(得分:4)
根据具体情况和您的要求,有不同的定义。
有些人将模块公开的所有公共类型称为API。通过这个非常广泛的定义,几乎每个库或包都有一个API。我认为这是一个非常普遍的定义,但不是每个人都同意它。
在更抽象的层面上,API是一种定义某些功能的合同或规范。在这种情况下,API更像是模块或服务的定义良好的接口,用于将公共可用功能与其内部实现分开。这种API的一个很好的例子是Java EE API。
实际上,在Java中,API通常是一个接口(或者有时是一组接口)。功能由接口方法和文档定义。 API本身不需要任何功能(或者至多只有一些基本的默认类)。
由另一个类实现接口并提供已定义功能的实现。这些实现不应违反合同。
如果一个类想要使用API,它只访问接口而不是实现类。这是“接口程序,而不是实现”的原则。在我看来,这是API最重要的方面,也是API与常规接口的区别。它使API可重用,并使内部实现能够在不破坏API的情况下进行更改。
当然,如果类只使用API,那么仍然需要某种机制来获取实现API的类的实例。通常它是某种工厂方法或依赖注入。
包装通常取决于API的用法。由第一个定义定义的API通常包含在其库的jar中,因为单独导入它们没有意义。另一种API可以有多个实现,应该单独打包。
答案 1 :(得分:1)
是的,您只需要编写需要实现所需功能的类。确保其他程序员使用您的代码可以访问所请求的任何功能。 (他们需要使用的方法应该是public
。)
答案 2 :(得分:0)
我说你的假设是正确的 - 是的,你被要求写一个“可以导入的包并通过类/函数提供所需的功能。”
然后,我再也没有写过API。我试图想象一个“离线”的,但想到的例子大多被称为SDK。
无论如何,这就是维基百科在这个问题上所说的话:
面向对象语言中的API
在最简单的形式中,对象API描述了对象如何在给定的面向对象语言中工作 - 通常它表示为一组具有相关类方法列表的类。
例如,在Java语言中,如果要使用类
来使用类型Scanner
(在基于文本的程序中读取用户输入的类),则需要导入java.util.Scanner
库,因此可以通过调用一些类'方法Scanner
的对象
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
System.out.println("Enter your name:");
Scanner inputScanner = new Scanner(System.in);
String name = inputScanner.nextLine();
System.out.println("Your name is " + name + ".");
inputScanner.close();
}
}
在上面的示例中,方法
nextLine()
和close()
是Scanner
类的API的一部分,因此在该API的文档中进行了描述。
所以我在这里读到的是,在OO语言中,你可以认为任何类都是某种类型的API。 Swift是用于构建UI的API,整个JDK本身是一个用于为可以运行Java运行时环境的任何东西构建软件的API。
在这种[面向对象]语言中,API仍然作为库分发。例如,Java语言库包括一组API,这些API以开发人员用来构建新Java程序的JDK形式提供。 JDK包含JavaDoc表示法中的API文档。
另请注意......
API通常与软件库相关:API描述并规定了预期的行为,而库是这组规则的实际实现。单个API可以以不同库的形式具有多个实现(或者没有,是抽象的),这些库共享相同的编程接口。
所以基本上,无论谁告诉你“它需要做X和Y”都为你描述了一个API(使用自然语言),你应该在面向对象的库中编写它的实现 - 一个库。 (多年以后,其他一些开发人员可能正在编写一个实现API的新库,由JavaDoc文档描述您的产品。)
所以,是的,您的可交付成果是一个可以导入并在其他人的Java代码中使用的包。