我正在阅读有关zope组件架构的精彩教程:
http://www.muthukadan.net/docs/zca.html#adapters
我似乎无法理解 Adapters 章节。
>>> from zope.interface import implements
>>> from zope.component import adapts
>>> class FrontDeskNG(object):
...
... implements(IDesk)
... adapts(IGuest)
...
... def __init__(self, guest):
... self.guest = guest
...
... def register(self):
... guest = self.guest
... next_id = get_next_id()
... bookings_db[next_id] = {
... 'name': guest.name,
... 'place': guest.place,
... 'phone': guest.phone
... }
如果我错了,请纠正我。上面的类FrontDeskNG
是一个适配器,对吗?正如文章中所写:
FrontDeskNG是IDesk的适配器,适用于IGuest
好的,现在我有适配器,为什么我必须注册它才能使用GlobalSiteManager
才能使用它?
我正在开发移动游戏后端,我希望通过查看Zope组件架构来使代码更加模块化。我需要能够使用任何数据库技术交换我的存储,并使代码仍然有效。这似乎是ZCA自豪地宣传的东西。我从未读过着名的GoF设计模式书,所以请耐心等待。
答案 0 :(得分:1)
一个实用的优点是它允许以下非常酷的片段;
use_me_like_a_desk = IDesk(instance_of_something_providing_iguest)
除了你想要提供IDesk接口的东西之外,你不必指定任何东西。只要您注册了将IGuest转换为IDesk的适配器,一切正常。
这可能是最好的示例,但您可以使用注册框架进行许多查询。例如,您可以提出要求;
我有这个东西,请确保它有这个界面。
甚至是公用事业
请告诉我为我的应用程序提供此界面的东西
通常使用zcml按应用程序完成各种适配器和实用程序的所有注册。这样可以轻松地将一个适配器换成另一个适配器,或者使用不同的实用程序实现,而无需更改大量代码。
更一般地说,组件的注册加强了解耦。您可以构建多个可以协同工作的模块,而无需将它们组合在一起。两个模块需要协同工作的唯一事情是一组通用的接口。
这使得编写无缝地协同工作的模块变得非常容易,而不会使它们彼此依赖,这反过来又可以轻松地添加,删除,发展和测试新组件而无需大量重构。
我确信你已经发现zope文档的各个部分已经分散并且很难找到。我需要很长时间才能想到它们为点击带来的一些概念和优势,你能做的最好的事情就是尽可能多地阅读,然后在阿拉斯加的洞穴里住六个月并冥想它。
Comprehensive Guide to Zope Component Architecture是一个良好的开端,但我也建议至少阅读zope.component docs和zope.interface docs。特别是this example might help you understand the benefit