0

我正在阅读关于 zope 组件架构的精彩教程:

http://www.muthukadan.net/docs/zca.html#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 设计模式书,所以请多多包涵。

4

1 回答 1

2

一个实用的优势是它允许以下非常酷的片段;

use_me_like_a_desk = IDesk(instance_of_something_providing_iguest)

除了您想要提供 IDesk 接口的东西之外,您不必在那里指定任何东西。只要您注册了将 IGuest 转换为 IDesk 的适配器,一切正常。

换句话说

这可能是最好的示例,但是您可以使用注册框架进行许多查询。例如,您可以只问;

我有这个东西,请确保它有这个接口。

甚至在公用事业的情况下

请给我为我的应用程序提供此接口的东西

优点

通常,各种适配器和实用程序的所有注册都是使用 zcml 为每个应用程序完成的。这使得将一个适配器换成另一个适配器变得很容易,或者使用实用程序的不同实现而无需更改大量代码。

更一般地,组件的注册加强了解耦。您可以构建多个协同工作的模块,而无需将它们耦合在一起。两个模块需要一起工作的唯一东西是一组通用的接口。

这使得编写无缝协同工作的模块而不会使它们相互依赖变得非常容易,这反过来又使添加、删除、发展和测试新组件变得容易,而无需大量重构。

更多信息

我敢肯定,您已经发现 zope 文档的各个部分分散且难以找到。我认为对于一些概念和它们带来的好处,点击需要很长时间,你能做的最好的事情就是尽可能多地阅读,然后在阿拉斯加的山洞里住六个月并冥想它。

Zope 组件架构综合指南是一个好的开始,但我也建议至少阅读zope.component 文档zope.interface 文档。特别是这个例子可以帮助你理解好处

于 2013-10-15T14:06:28.240 回答