设计一个更好的API?

6
  1. 设计API时应遵循哪些最佳实践和模式?
  2. 如何以最佳方式实现隐藏实现(C++ / Java)?
  3. 设计通用性强的API?
  4. 有哪些参考书籍/链接可以为初学者提供清晰的示例指导?

这篇关于编程的内容可能值得一读:http://pkisensee.spaces.live.com/Blog/cns!3C84486A9D832EB7!410.entry,另外http://gamearchitect.net/2008/09/19/good-middleware/也可以看看。 - jalf
有很多好的答案,所以不需要再添加了。但是在我看来,一个好的API应该是:1)最小化 2)完整 3)一致 4)易于正确使用,难以错误使用。 - Evan Teran
10个回答

10

我不确定我对你的所有问题都有很好的答案,但是我认为我对第一个问题有一个好的答案。

在它被写出来之前就尝试使用它。我的意思是,像真正存在一样为代码编写单元测试。在你甚至还没有写一行API代码之前,先写一些将使用该API的代码。当你尝试使用它时,你会很快地看到你原先想象中的设计中哪些是有效的,哪些不是,并且由于你还没有写任何实际的代码,所以你会很快进行更改以匹配它的实际用途。

如果你还没有将任何内容提交到代码中, 那么更改某些内容就不会有任何阻力,但是一旦你提交了,通常就会有一定程度的犹豫。


我经常发现编写一个“示例应用程序”来使用API比仅编写单元测试更好,因为这样您可以看到API在实际环境中如何使用。 - Robert Fraser


5

问题四:

在我看来,Josh Bloch 在编写良好的 API 方面有最好的想法,并且他可以用非常易于理解的方式解释它们。上面的视频将为您解答 Q1-3。


4
我建议您查看如何设计一个好的API以及为什么它很重要

一个写得好的API对于编写它的组织和使用它的所有人都是非常有价值的资产。鉴于良好的API设计的重要性,关于这个主题的文章却很少。在这个录制自Javapolis的演讲中,Java库设计师Joshua Bloch教授如何设计良好的API,并提供了许多好的和坏的API示例。

http://www.infoq.com/presentations/effective-api-design

另外,您也可以阅读实用API设计:一位Java™框架架构师的自白这本书。我没有阅读过,所以不确定它的内容是否对您有用。

另一个需要检查的资源是:如何设计 (模块) API


2
我有一个关于第三点(通用API设计)的提示:
首先基于特定的用例来设计你的API;让你的设计更具体,而不是通用的 - 如果你发现API可以被重复使用,那么再进行通用化。
过去我曾看到API被重构到如此通用的程度,以至于其中一个方法参数是一个“参数”对象,或者更糟糕的是,对应于任意XML片段的DOM树。
void processData(Parameters reportParams);

使用这种超级通用的方法:

  • 错误不太可能在编译时或通过查看代码被发现,它们会在运行时出现,使得难以追踪。
  • 代码将变得不太可读和不太自我记录,使得难以使用或实现。
  • API 实现将变得丑陋,因为内部需要将此“参数”对象分解成特定的用例并对其进行操作。

1

Apress - 实用API设计 - 一位Java架构师的自白 - 2008年

Pragmatic - 面向接口的设计 - 2006年


1

阅读Effective Java,作者是Josh Bloch。这本书非常适合任何Java程序员,同时也涵盖了许多有关创建有用API的问题。


1

看看这个播客

它谈论了一些关于API设计的非常好的概念。


0
您可以实施以下准则:
1)使用已知的或已建立的方法,例如:
createPatientRecord();
createPatientAppointment();
createPatientCheckup();

2) 返回值:

  • 如果有任何异常,抛出异常
  • 如果没有找到对象,返回 null
  • 如果有多个对象,返回空列表而不是 null

3) 参数排序/顺序的一致性

recallPatientRecord(long patientId, long hospitalId);
recallPatientRecord(long patientId);
recallPatientRecord(long patientId, long hospitalId, int disciplineCode);

-1

这个问题几乎不可能回答。它甚至可能不是适合在Stack Overflow上提问的问题(A:我如何解决特定问题?B:这是明确的答案)。

1.设计API时应遵循哪些最佳实践和模式

我们谈论的是哪种编程语言?我们谈论的是哪个问题域?因为对于一个编程语言/问题域而言有效的方法,对于另一个编程语言/问题域可能并不适用。

2.如何以最佳方式实现隐藏实现(C++/Java)

这个问题有一个答案,而且它太长了,无法在此处写出。事实上,它太长了,一个网站的参考资料是不够的。有许多网站和书籍,结合起来,将回答这个问题。哦,我只是在谈论C++。重复整个过程,针对Java。还有C#,Python等(等等)。

4.任何指导初学者的参考书/链接,带有简洁的示例

选择一种编程语言。然后我可以提供书籍和链接的参考资料。正如Fred Brooks所写,没有银弹。从一种编程语言到另一种编程语言,你不能采取单一的思维方式。在一种编程语言中成为一个好的API的特点,在另一种编程语言中可能是设计错误。相信我,我通过尝试在这些语言中应用C++、Delphi和Java习惯做法而学到了这个教训。它导致了糟糕的API和糟糕的代码。
在设计API时也存在竞争性的思路。不幸的是,现实情况是没有人是100%正确的。事实上,当你知道多种思路并且知道何时将某种思路应用于特定问题时,你才能成为一个优秀的API设计师。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接