中间件API的最佳做法是什么?
我们正在开发一种C ++和Java中间件SDK,例如,游戏开发人员,动画软件开发人员,Avatar开发人员将其用作库/ DLL,以增强其产品。
我想知道的是:开发这些类型的API是否有标准的"最佳实践"?
我在考虑可用性,可读性,效率等方面。
解决方案
回答
有多种设计api的方法,具体取决于我们要解决的问题。我认为完整地解决这个问题是值得的,例如整本书的四个模式。特别是对于Java以及一般的OO编程,我建议使用Effecitve Java 2nd Edition。第一个是通用的并且流行的编程模式,当它们适用时以及它们的好处是很多的。有效的Java以Java为中心,但是部分通用性足以应用于任何编程语言。
回答
看一看框架设计指南。我知道它是特定于.NET的,但是我们可能也可以从中学习很多常规信息。
回答
我在这方面最喜欢的两个资源:http://mollyrocket.com/873和http://video.google.com/videoplay?docid=-3733345136856180693
回答
yrp提到的Josh Bloch的视频是我推荐的经典视频。
一些一般准则:
- 务必主要根据接口,工厂和构建器来定义API。
- 务必明确指定哪些包和类是API的一部分。
- 请提供专门用于根据API进行编译的jar。
- 不要过分依赖继承或者模板方法模式-随着时间的流逝,它会变得脆弱而易碎。
- 不要使用单例模式,或者至少要格外小心。
- 不要创建包和类级别的javadoc来解释用法和概念。
回答
通过在Windows上使用第三方库,我学到了以下两点:
尝试将库作为DLL而不是静态库进行分发。这使不同的c编译器和链接器之间具有更好的兼容性。在Visual c ++中,静态库的另一个问题是,选择运行时库会使库与使用不同运行时库的代码不兼容,并且我们最终可能需要为每个运行时库分发该库的一个版本。
如果可能,请避免使用c ++。在不同的编译器之间,c ++名称修改存在很大差异,并且为Visual c ++构建的库不太可能从Windows中的另一个构建环境进行链接。当涉及到C时,情况会好得多,特别是如果我们使用dll的话。
如果我们真的想获得c ++的优势(例如通过构造函数和析构函数进行资源管理),请在c ++中构建一个方便层,将其作为源代码分发,以隐藏c函数。由于用户拥有源代码并在本地编译,因此在本地环境中不会出现任何名称混乱或者abi问题。
在不了解太多有关从Java调用c / c ++代码的知识的情况下,由于名称处理问题,我希望使用c代码比使用c ++代码更容易。
《 Imperfect C ++》一书对库兼容性进行了一些讨论,我发现这很有帮助。