Django中基于接口和基于API的编程

时间:2012-10-29 15:17:34

标签: python django api interface

我在网上搜索了这个问题。并且有一个帖子已经具有相同的标题,但并没有真正描述实际的问题。所以我找不到合适的解决方案。

我正在开发非常大的项目。因此,绝对有必要将其拆分为多个层或组件或任何您想要调用的组件。

每个图层都公开了一些功能。对于每一层,如何实现它并不重要(因为这通常会在大型项目中发生变化),但重要的是,我们如何调用功能以及它返回的内容=>合同!

如果我们有两个关于TransactionService的层和另一个关于BankService的层,则BankService是一个高于TransactionService的层,它将使用transactionservice。 transactionService只会执行一个事务:

TransactionVO doTransaction(clientFromVO, clientToVO);

另一层做了额外的东西.. TransactionVO不是一个模型类!它们是值对象,因此服务的实现不会暴露给层外。 在java中,我们可以通过以下方式实现:

public interface TransactionService {
   TransactionVO doTransaction(clientFromVO, clientToVO);
}

实施将如下:

public class TransactionServiceImpl {
   public TransactionVO doTransaction(clientFromVO, clientToVO) { 
     // implementation 
   }
}

因为我们预先定义了接口,所以我们有一个合同,说明每个服务的外观(没有实际的实现,TransactionServiceImpl不需要存在)。

因此,2个团队可以在每个层上同时工作,他们可以模拟实现。 我想知道如何在Django中实现这一目标!为每个层创建一个REST api简直没有完成(很多开销,性能问题......)那么对于那些有大型项目经验的人来说呢?

2 个答案:

答案 0 :(得分:1)

Python没有与Java相同的“接口”。相反,存在“鸭子打字” - 暴露行为暗示“界面”。这个问题的答案(How to handle "duck typing" in Python?)应解决围绕此问题的一些问题。

使用像Python这样的动态语言,如果要在实现类之前定义类的行为,则需要提前编写测试用例。如果您不熟悉Python中的测试驱动开发,可以start by reading this.

有许多可用于Python的模拟库。 This就是一个例子。

答案 1 :(得分:0)

似乎python没有提供开箱即用的功能。但是有一种叫做abc模块的东西:

我引自http://www.doughellmann.com/PyMOTW/abc/ “通过定义抽象基类,您可以为一组子类定义一个通用API。这种功能在第三方将要提供实现 ...的情况下特别有用”

这不是一个完美的解决方案,但它提供了我需要的一些东西。 以下评论让我对此:Java abstract/interface design in Python因此值得一提;)