【问题标题】:API design and DAO patternAPI设计和DAO模式
【发布时间】:2012-01-20 13:41:28
【问题描述】:

我需要为应用程序创建一个 API(比如说库管理器)。像许多典型应用程序一样,它是在 ORM 工具之上制作的,该工具使 POJO 持久化到 dbms 中。 现在我必须制作 API,以便其他开发人员可以将其用作 JAR。可以说,我们希望用户将书籍添加到图书馆。 我对设计它的最佳方式有很多疑问。

1) 为 POJO 提供类似 DAO 的类是个好主意吗:
BookManager { create(...) delete(Book book); List<Book> getAll(); ... }

2) 暴露对象:

a) 我应该将实际的应用程序 POJO 暴露给 API 层吗? 这些有一些可能不想公开的应用程序逻辑和一些我想公开的逻辑。例如,我想公开 book.getPages() 但不公开 book.deletePage(int pageNo)

b) 专门为 API 层创建重复对象。只会暴露接口。

c) 根本不暴露对象。 API 使用参数。例如

BookManager { create(String name, int price); delete(String name); List<Pair<String, Integer>> getAll(); ... }

这意味着与系统的单点访问。如果要对 POJO 执行某些操作,将从 BookManager 调用它。例如,ClockManager.start(String clockName)。它还提供了灵活性,例如在 ClockManager 中拥有 startAll() 等方法。

3) 最后,BookManager 应该包含 update() 方法,还是应该存在于 Book 本身中?更新意味着将配置保存到数据库中。什么更有意义:

Book book = bookManager.create("API Design"); book.setPrice(); book.update();

或者,

Book book = bookManager.create("API Design"); book.setPrice(); bookManager.update(book);

提前致谢,
阿曼

【问题讨论】:

    标签: api dao


    【解决方案1】:

    我不禁觉得提出的一些问题是因为您的 POJO 包含更接近 ActiveRecord 之类的功能。作为包含“.GetPages()”方法的示例书。如果它是一个真正的 POJO,它将已经加载了页面(或对 DAO 的隐藏引用,因此它们可以被延迟加载)。同样,当您删除一个页面时,您此时不需要了解 DAO。您从书中删除页面,然后将书保存到 BookDAO。此外,我不推荐您通过 API 公开的任何 POJO 的延迟加载方法。

    尝试准确回答您的问题:

    1. 我认为是的。

    2. 显然选项 (c) 最有可能被所有消费者使用。如果您正在调用您的 API 并且您希望删除一本书,您是真的想先让这本书传入,还是只想传入 ID 或名称(您可能已经拥有)。

    3. BookManager 应该有更新(书本)。如果您将 Update 放在 Book 上,那么您将脱离 POJO 进入 ActiveRecord 类型的功能。在正确的情况下两者都可以,但混合总是令人困惑。

    注意:对于 (3),完整的活动记录类型将是

    Book book = Book.Load("API Design"); book.SetPrice(45); book.Update()
    

    【讨论】:

    • 感谢 Paul,它实际上并不是一个图书馆管理系统。我只是想提出一些现实世界的例子。
    • 好的,只是用你的例子来说明我所说的 activerecord patten 的意思 - 加载是对象上的静态(C#,不确定它在 Java 中是什么)方法,因为它的目的是创建一个实例,而 Update 是实例上的方法。
    • 感谢 Paul,它实际上并不是一个图书馆管理系统。我只是想提出一些现实世界的例子。
      我完全同意您关于将 POJO 跨入 ActiveRecord 类型功能的观点。您能否解释一个适合使用 book.update() 的场景。我相信通过 bookManager.update() 我向用户发出了明确的信号,即如果您想与 API 交互,请通过 Manager 接口。
    • 感谢 Ferenc 和 Paul 的建议。我不知道我怎样才能接受这两个答案。再次感谢。
    【解决方案2】:

    简答:

    1. 不一定。我不会让我使用的 ORM 工具支配我的设计。你没有说你用的是什么工具,但是好的工具非常灵活,几乎可以持久化任何 POJO 设计。

    2. 选择 b)。不要暴露超过你需要的东西,但最好是暴露对象而不是引入 c) 中使用的那种间接方式

    3) 第一个选项更好。

    我实际上并不确定我给你的建议是否正确。原因是它们需要考虑许多权衡。根据我对您项目的了解,这是我得到的最佳建议...

    我维护一个关于 API 设计的网站:

    http://theamiableapi.com/

    您可能还想读一两本书。在菜单中的资源下查看。 Joshua Bloch 的那个,或者 Jaroslav Tulach 的那个

    费伦茨

    【讨论】:

    • 感谢 Ferenc,刚刚完成了 Joshua Bloch 的 API 设计视频。已经开始读一本书了。 ORM 工具是 DataNucleus。
    • 看到这两个响应(到目前为止)几乎相互矛盾,这一定很令人困惑。有趣的是,我不同意下面的保罗。他正在为您提供有关典型 ORM 使用模式的正确建议。我更多地从 Java API 设计的角度解决了您的问题,您尝试尽可能多地隐藏实现细节(在这种情况下,持久层是如何工作的)。只有你能说出你的情况更重要的是什么。
    猜你喜欢
    • 2013-07-12
    • 2012-04-14
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2012-10-29
    • 1970-01-01
    相关资源
    最近更新 更多