在Django中的接口基础和API基础编程

9 浏览
0 Comments

在Django中的接口基础和API基础编程

我已经在网络上搜索了这个问题。已经有一个帖子与相同的标题,但并没有真正描述实际的问题。因此,我没有找到正确的解决方案。\n我正在开发非常大的项目。因此,将其分成几个层或组件是绝对必要的,不管你想如何称呼它。\n每个层都暴露一些功能。对于每个层来说,如何实现并不重要(因为在大型项目中,这经常发生变化),但重要的是我们如何调用功能以及它返回给我们什么=>合同!\n如果我们有两个层,一个涉及TransactionService,另一个涉及BankService,BankService是高于TransactionService的一层,并将使用transactionService。\ntransactionService只会执行一个事务:\n

TransactionVO doTransaction(clientFromVO, clientToVO);

\n还有另一层做其他事情。TransactionVO不是一个模型类!它们是值对象,所以服务的实现不会暴露给外部层。\n在Java中,我们可以通过以下方式实现:\n

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

\n实现将类似于:\n

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

\n因为我们事先定义了接口,所以我们有一个合同,规定了每个服务的外观(而不需要实际实现,TransactionServiceImpl不需要存在)。\n因此,两个团队可以同时在每个层上工作,并可以模拟实现。\n我想知道如何在Django中实现这一点!为每个层创建一个REST API是不可行的(开销太大,性能问题..)。那些有大型项目经验的人有什么建议?

0
0 Comments

最近我在使用Django进行开发时,遇到了一个问题。在Python中,似乎没有直接提供接口的功能。不过,我发现了一个叫做abc模块的东西。从http://www.doughellmann.com/PyMOTW/abc/中的引用来看,通过定义一个抽象基类,可以为一组子类定义一个公共的API。这个功能在第三方提供实现的情况下尤其有用。

虽然这个方案并不完美,但它提供了我需要的一些功能。在Java abstract/interface design in Python的评论中,我找到了一些启发,值得一提。

也许你应该停止试图在Python中编写Java代码?我理解你的观点。但是,仅仅因为你不理解这种方法的必要性并不意味着它是错误的。如果这样的方法是错误的,那么就不会有那么多书籍提到基于接口或基于API的编程了。尽管如此,你对这种方法的理解并不重要,所以质疑这种方法并不能让有类似问题的人更接近解决方案。

在我研究了这个问题后,我想分享一下我找到的解决方法。在Django中,可以通过使用抽象基类和接口的概念来实现接口化的编程。

首先,我们需要导入abc模块:

import abc

然后,我们可以定义一个抽象基类来定义公共的API:

class MyInterface(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def my_method(self):
        pass

现在,我们可以创建实现该接口的具体类:

class MyImplementation(MyInterface):
    def my_method(self):
        # 实现具体的逻辑
        pass

通过这种方式,我们可以确保所有实现了MyInterface的类都必须实现my_method方法,从而实现了接口化的编程。

当然,这个方法可能并不是完美的,但它提供了一种在Python中实现接口化编程的方法。希望对有类似问题的人有所帮助。

0
0 Comments

接口基础和API基础编程在Django中的出现原因是,Python没有像Java那样的“接口”。相反,它使用“鸭子类型” - 其中“接口”由暴露的行为隐含表示。如果想在实现类之前定义其行为,可以提前编写测试用例。对于在Python中进行测试驱动开发的新手,可以参考这篇文章:http://www.blog.pythonlibrary.org/2011/03/09/python-102-an-intro-to-tdd-and-unittest/。

Python中有许多可用的模拟库,例如:http://www.voidspace.org.uk/python/mock/。

这里很难描述接口编程的所有优点。但是鸭子类型并不是一个解决方案。例如,DragonServiceImpl可以提供一个名为fly()的方法,而YellowDuckServiceImpl和WhiteDuckServiceImpl也提供了类似的方法。但是,龙不是鸭子!无论如何,在这里很难描述API或基于接口的编程的所有优势。在我正在研究的问题中,似乎没有完美的解决方案。但是,有一个模块可能可以解决部分问题,可以参考这里的文档:http://docs.python.org/2/library/abc.html。

0