如何组织API?

如何组织API?,api,architecture,Api,Architecture,我正在设计一个API,我希望它是简单易用的。所以,如果我有客户、对账单和付款。拥有诸如Customer、CustomerHandler、Statement、StatementHandler、Payment、PaymentHandler之类的对象有意义吗?这样,当开发人员想要对客户做一些事情时,他/她知道要创建一个CustomerHandler,然后希望对客户执行的所有可能的功能都在处理程序中 方法如下: 客户管理员: AddCustomer(客户) GetCustomer(customerI

我正在设计一个API,我希望它是简单易用的。所以,如果我有客户、对账单和付款。拥有诸如Customer、CustomerHandler、Statement、StatementHandler、Payment、PaymentHandler之类的对象有意义吗?这样,当开发人员想要对客户做一些事情时,他/她知道要创建一个CustomerHandler,然后希望对客户执行的所有可能的功能都在处理程序中

方法如下:

  • 客户管理员:

    • AddCustomer(客户)
    • GetCustomer(customerID)
    • GetCustomerCount()
  • 语句处理程序:

    • AddStatement(customerID)
    • GetStatement(语句ID)
    • GetStatementCount(customerID)
  • PaymentHandler:

    • GetPaymentsByCustomer(customerID)
    • GetPayment(paymentID)
    • GetPaymentCountByCustomer(customerID)
这样,如果开发人员想要接收付款,他/她知道要去找PaymentHandler。我的同事认为像GetPayments(customerID)这样的函数属于管理客户的类。所以,它就像Customer.GetPayments()一样作为付款。但是,如果我有其他实体,比如Worker,则会有Worker.GetPayments()作为付款。因此,我看到了这两种方法的逻辑。第一种方法是将所有内容组合在一起,这样无论付款来自谁,都可以通过GetPaymentsByCustomer(CustomerID)和GetPaymentsByWorker(WorkerID)等函数从一个类中获得所有内容。这样一来,您就不必在不同的handler或manager对象中跌跌撞撞地获得付款。这两种方法对我都有意义,你呢?或者,我们都走了,还有更好的方法吗? 提前谢谢

在“它属于哪里”的辩论中,我通常根据它返回的内容来决定它属于哪里。如果您有一个GetPayments()方法返回付款对象列表,那么它应该位于PaymentHandler上

这确实是一件非常主观的事情,但按返回类型进行操作可以确保创建付款对象的所有内容都在PaymentHandler中,客户对象在CustomerHandler中,等等

当您以后需要进行更改时,这可以稍微简化一些事情,并且正如您所提到的,可以让API用户非常容易地确定他们需要调用哪个处理程序——如果他们需要客户,他们将与CustomerHandler一起工作


如果您有一个假设的方法,比如GetPayments(customerId,workerId),可以为客户和工人获得付款,那么它也可以消除混淆。根据你的同事的建议,不清楚这种方法将走向何方,因为它涉及付款、客户和员工。按返回类型分类几乎总是很清楚的,因为函数只返回一件事。

如果您正在设计一个API,那么您可以尝试从预期用户的角度编写一些模型。实现一些用例,即使只是在白板上,看看哪种方法更有价值


在您的支付示例中,工人和客户都可以实现支付接口。如果您后来不得不添加一个可以“付费”的对象,您只需让它实现相同的接口即可。如果您有一个支付处理程序,并且需要添加一个可以支付的新类型的东西,那么您必须通过添加一个新方法来更改处理程序。随着时间的推移,我想这会变得很麻烦。当然,您可以将两者结合使用,并使用一个handler实用程序作为支付系统的前端。

您基本上描述了两种数据访问方式(模式):

  • 活动记录-
  • 数据映射器-
请拿马丁·福勒的书,通读所有的利弊。特别是,如果您试图将对象和API公开为web服务,您可能希望使用数据映射器方法(如您所建议的)


活动记录非常流行,因为它更简单。自己决定什么最适合你的需要。

哇,这真让我难以接受。我想我得去拿那本书。请别担心。这不是一门火箭科学。这是一本非常好写的书,很容易阅读——特别是如果你已经做了一些工作的话。