【问题标题】:Interface-Based and API based programming in DjangoDjango中基于接口和基于API的编程
【发布时间】:2012-10-18 22:25:33
【问题描述】:

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

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

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

如果我们有两层,一层与 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 并没有完成(开销很大,性能问题..)那么对于那些有大型项目经验的人来说呢?

【问题讨论】:

    标签: python django api interface


    【解决方案1】:

    Python 没有与 Java 相同的“接口”。取而代之的是“鸭子打字”——其中“界面”隐含在暴露的行为中。此问题 (How to handle "duck typing" in Python?) 中的答案应解决与此相关的一些问题。

    对于像 Python 这样的动态语言,如果你想在一个类实现之前定义它的行为,你需要提前编写一个测试用例。如果你是 Python 测试驱动开发的新手,可以start by reading this.

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

    【讨论】:

    • 这里很难描述接口编程的所有优点。但是鸭子打字不是解决方案。例如,DragonServiceImpl 可以提供方法 fly()。 YellowDuckServiceImpl 和 WhiteDuckServiceImpl 也提供了这样的方法 fly()。但是龙不是鸭子!无论如何,在这里描述 API 或基于接口的编程的所有优点是很复杂的。在我看来,python 中没有完美的解决方案。但是我有一个模块可以解决我现在正在研究的部分问题:docs.python.org/2/library/abc.html
    【解决方案2】:

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

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

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

    【讨论】:

    • 也许你应该停止尝试用 Python 编写 Java?
    • 我理解你的论点。但这并不是因为你不了解这种方法的必要性,它是一种不好的方法。如果是这样,就不会有那么多书提到基于接口或基于 API 的编程。话虽如此,您是否了解这种方法的必要性是无关紧要的,因此质疑该方法不会让任何有类似问题的人更接近解决方案。
    猜你喜欢
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多