English 中文(简体)
如何组织API?
原标题:
  • 时间:2009-03-09 18:18:53
  •  标签:

我正在设计一个API,希望它易于使用。因此,如果我有客户、账单和付款。这样做有意义吗:客户、客户处理程序、账单、账单处理程序、付款和付款处理程序等对象吗?这样,当开发人员想要处理客户时,他/她知道要创建一个客户处理程序,然后所有可能想要执行的与客户有关的功能都在处理程序中。

方法,例如:

  • 客户处理员

    • AddCustomer(customer)
    • GetCustomer(customerID)
    • GetCustomerCount()
  • 声明处理程序:

    • AddStatement(customerID)
    • GetStatement(statementID)
    • GetStatementCount(customerID)
  • 付款处理程序:

    • GetPaymentsByCustomer(customerID)
    • GetPayment(paymentID)
    • GetPaymentCountByCustomer(customerID)

This way if the developer wants to work on receiving payments he/she knows to go to the PaymentHandler. My coworker thought that functions like GetPayments(customerID) belong in a class that manages the customer. So, it would be like Customer.GetPayments() AS Payments. But if I have some other entity like Worker, there would be Worker.GetPayments() AS Payments. So, I see the logic with both approaches. The first one groups things together so that if no matter whom the payment is coming from you get it all from one class by having functions like GetPaymentsByCustomer(CustomerID) and GetPaymentsByWorker(WorkerID). This way one does not have to stumble through different handler or manager objects to get payments. Both approaches make sense to me, how about you? Or, are we both off and there is a better way to do this? Thanks in advance!

问题回答

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

在您的付款示例中,工作人员和客户都可以实现可支付接口。 如果您以后需要添加一个可以“支付”的对象,则可以简单地使其实现相同的接口。 如果您有一个付款处理程序,并需要添加一种新类型的可支付的东西,则必须通过添加新方法来更改处理程序。 随着时间的推移,我想这可能会变得繁琐。 您当然可以使用这两种方法的组合,并使用一个处理程序实用程序作为您的付款系统的前端。

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

请获取马丁·福勒(Martin Fowler)的书《企业应用架构模式》并阅读其所有的优缺点。尤其是如果您尝试将您的对象和API作为Web服务公开,则可能希望采用数据映射器方法(就像您建议的那样)。

Active record非常流行,因为它更简单。自己决定什么最适合您的需求。

在“它应该属于哪里”的辩论中,我通常根据其返回值来决定物品属于哪个部分。如果你有一个返回Payment对象列表的GetPayments()方法,它应该放在PaymentHandler上。

这是一个非常主观的事情,但按返回类型进行操作可以确保所有创建 Payment 对象的东西都在 PaymentHandler 中,Customer 对象在 CustomerHandler 中等等。

当你需要稍后进行更改时,这可以简化一些事情,并且正如你提到的那样,使API用户非常容易找出他们需要调用的处理程序 - 如果他们需要一个顾客,他们将与顾客处理程序一起工作。

如果您有一个假设的方法,例如GetPayments(customerId,workerId),可以为客户和工人获取付款,它还可以消除混淆。 使用您同事的建议,由于涉及付款,客户和工人,因此不清楚此方法将放在哪里。 按返回类型分类几乎总是清晰的,因为函数只返回一件东西。 它也消除了混淆,如果你有一个假设的方法,像GetPayments(客户ID,工人ID),那么会为一个客户和一个工人获取付款。使用你的同事的建议,由于它涉及到付款、客户和工人,这个方法将被放在哪里是不清楚的。按返回类型分类几乎总是清晰的,因为一个函数只返回一件东西。





相关问题
热门标签