【发布时间】:2017-07-31 13:03:48
【问题描述】:
我正在用 Java 开发一个小型库,它可以从压缩的图像数据源(例如 PNG 文件)读取图像并对其进行解码,返回一个 Image 对象。 Image 类具有多个名为 Image.createImage(...) 的函数,可以根据指定的参数创建图像。
我已经在库 API 中添加了几个公共 Image.createImage(...) 方法,每个数据源类型一个:Image.createImage(Path)、Image.createImage(InputStream)、Image.createImage(String)、Image.createImage(byte[])、...,让用户轻松无需输入大量代码即可从各种数据源获取Image。
然而,这意味着每个方法的 Javadoc 都是重复的,并且 API 变得更大,因此学习起来有点困难,即使辅助方法本身非常琐碎(例如,Image.createImage(byte[]) 只是 return Image.createImage(new ByteArrayInputStream(array));),所以我'我决定重新设计我的库 API 设计。
我想到了三种不同的方法来重新设计我的Image API:
- 仅提供一种采用输入流的图像解码方法,例如
Image.createImage(InputStream),并让用户自己从他的数据源创建一个输入流(并且可能在 Javadoc 中包含一些示例代码,例如“要解码存储在文件中的图像,您可以使用Files.newInputStream(Paths.get(...))...”) - 为每个数据源类型提供一个(帮助)方法,例如
Image.createImage(ByteBuffer),Image.createImage(Path), ... 每个方法都需要复制 Javadoc (这实际上是目前的情况) - 设计一个
DataSource类,该类可以从一种数据源类型(例如new DataSource(Path),...)构造,并具有采用DataSource对象的单一图像解码方法,例如Image.createImage(DataSource)
我想知道哪种设计最好。
- 我认为第一个非常好,因为它使库非常小/轻量级,但缺点是用户必须自己编写“胶水代码”(或从 Javadoc 示例中复制它),因此必须知道如何从路径或资源字符串中获取
InputStream。我很想选择这种设计。 - 我认为第二个不太好,因为 Javadoc 变得非常“冗长”/很大,可能不值得在 API 中添加单行方法。
- 我认为第三个可能是最糟糕的一个,因为如果用户必须阅读
Image和DataSource的Javadoc,那么获取Image变得太复杂了,然后找到如何创建一个DataSource,我个人也觉得它非常“重量级”(让我想起具有大量类和包的非常大的框架,而我喜欢让我的项目保持小而简洁)。
如果您要使用这个库,您更喜欢哪种设计?第一个设计是最好的吗?
【问题讨论】:
标签: java api-design