最近我开始尝试与Python装修(高秩序的职能),因为它看起来像他们可能使我Django单元的测试更加简洁。例如,替代文字:

def visit1():
    login()
    do_stuff()
    logout()

我可以不做

@handle_login
def visit1():
    do_stuff()

然而,在一些尝试,我们发现,装饰都不简单,因为我有了希望。首先,我很困惑的不同的装饰语法,我发现在不同的例子,直到我了解到,装饰的行为非常不同的时候,他们 采用参数.然后我试着装饰方法,以及最终了解到,它不工作是因为我第一次有 把我的装饰成一个描述 通过加入一个 __get__ 法。在这整个过程中,我结束了混淆超过几次,仍然发现,调试这个"装饰"代码复杂得多,它通常是蟒蛇。我现在重新评估我是否真正需要的装修工在我的代码,由于我最初的动机是要保存一点点打字,而不是因为没有任何真正需要高功能。

所以我的问题是:应该装饰是大量使用或谨慎?是它没有更多的功能已大大增强,以避免使用他们?

有帮助吗?

解决方案

装饰器在它们的位置细,绝对不是要避免的 - 在适当的时候;-)。我看到你的问题的本质含义 “OK,所以当的的他们适当”?

添加周围的一些一些前缀和/或后缀代码但不是全部一些类的方法是一个很好的例子。是它的所有方法,一个装饰包裹所有方法将是不是重复@thisonetoo无休止;-)更好。如果在一个蓝色的月亮一次,然后它不值得重构出包装(装饰或其他)。在中间,有一个大的接地其中装饰器是相当合适的确实

它归结为编程的黄金法则之一 - 干燥,为不重复自己。当你看到你的代码变得啰嗦,你应该重构重复了 - 和装饰是对于一个很好的工具,虽然他们从唯一的一个很远(辅助方法和功能,自定义元类,发电机和其他迭代器,上下文管理器... 许多的,我们加入到了Python在过去几年中的特征可以最好地认为是DRY-帮手,更容易和更平滑的方式来分解出这样或重复的,频繁的形式!)。

如果没有重复,没有真正的呼吁重构,因此,(尤其是)装修人员没有真正的需要 - 在这种情况下,YAGNI(Y'Ain't会需要它)可以胜过干燥; - )

其他提示

亚历克斯已经回答了你的问题非常好,我想补充的装饰,使你的代码更容易被理解。 (有时,即使你正在做它只有一次)。

例如,最初,我写我的Django的观点,不用考虑授权在所有。而当,我写完这些,我可以看到哪些需要授权用户,只是把一个@login_required他们。

因此,任何人在我未来可以在一个网页中看到什么意见AUTH保护。

当然,他们更干,把这个无处不在。

如果不request.user.is_authenticated():     返回HttpResponseREdiect(..)

装饰一种方法来提升一个共同的 方案 出你的代码。

面向方面的编程 支持者们会告诉你,有很多共同方面,AOP是必不可少的中心。事实上,你可以读一个愚蠢的辩论对这个题目:

面向方面编程与面向对象编程

有几个常用例AOP。你可以读一些在这里:

你用AOP(面向方面的节目)在生产的软件吗?

有几个跨领域问题对其装饰是很有帮助。

  • 接入控制("安全")认证、授权、权限、所有权

  • 记录(包括调试艾滋病和审计)

  • 缓存(往往是一个实现的 性记忆化)

  • 一些错误的处理可能是一个共同方面,并因此适用于装饰的执行。

很少有其他的设计模式,它们是真正的跨领域和应该得到一个AOP装饰。

如果您在开始和许多功能结束相同的代码,我认为这将证明使用装饰增加了复杂性。

而不是像使用一个很好的(但也许复杂)模板有很多页面的网站,它确实节省了时间,并最终增加了透明度。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top