题
最近我开始尝试与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(..)
如果您在开始和许多功能结束相同的代码,我认为这将证明使用装饰增加了复杂性。
而不是像使用一个很好的(但也许复杂)模板有很多页面的网站,它确实节省了时间,并最终增加了透明度。