我正在阅读关于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设计模式书,所以请容忍我。
发布于 2013-10-15 14:06:28
一个实用的优点是,它允许以下非常酷的片段;
use_me_like_a_desk = IDesk(instance_of_something_providing_iguest)除了需要提供IDesk接口的东西之外,您不必在那里指定任何内容。只要您已经注册了一个将IGuest转换为IDesk的适配器,一切都会正常工作。
换句话说
这可能是最好的例子,但您可以使用注册框架进行许多查询。例如,你可以只需问一问;
我有这个东西,请确保它有这个接口。
甚至在公用设施的情况下
请告诉我为我的应用程序提供这个接口的东西。
优势
通常,每个应用程序都使用zcml完成各种适配器和实用程序的所有注册。这使得很容易将一个适配器替换为另一个适配器,或者使用不同的实用程序实现,而不必更改大量代码。
更广泛地说,组件的注册加强了解耦。您可以构建多个协同工作的模块,而不必将它们耦合在一起。两个模块需要协同工作的唯一东西是一组通用的接口。
这使得编写模块非常容易,这些模块可以无缝地协同工作,而无需相互依赖,这反过来又使添加、删除、进化和测试新组件变得容易,而无需大规模重构。
更多信息
我相信您已经发现zope文档的各个部分是分散的,很难找到。我想要花很长时间才能理解其中的一些概念和它们给点击带来的好处,你能做的最好的事情就是尽可能多地阅读,然后在阿拉斯加的一个洞穴里生活六个月,并对它进行冥想。
Zope组件体系结构综合指南是一个很好的开始,但我也建议至少阅读zope.component文档和zope.interface文档。特别是这个例子可以帮助你理解它的好处。
https://stackoverflow.com/questions/18228252
复制相似问题