上个月我接了个活,要给一个老系统加功能。打开代码一看,几十个函数,每个函数开头都要写日志,结尾要处理异常,中间还要算耗时。重复代码看得我头皮发麻。
改一个函数还行,改几十个那得改到什么时候。我当时就想,Python里那个装饰器能不能帮我一把。之前学过一点,但一直没在实际项目里用过。这次被逼急了,硬着头皮试了试。
先抄了一段日志装饰器的代码。跑了一下没报错,心里踏实了一半。我把日志功能单独拆出来做成装饰器,然后往每个函数头上加个@log_time。神奇的事情发生了,那些重复的日志代码全消失了,函数本身只剩下业务逻辑。干干净净,看着就舒服。
后来发现不光日志能复用,权限校验也能用装饰器搞。原来每个函数里都要写“当前用户有没有权限”,改成装饰器之后,函数里就剩一个判断。代码量直接少了三分之一。
更爽的是性能统计。老板要求看每个接口的响应时间。以前要在每个函数里手动记时间戳,算差值,然后打印。用装饰器写了个@timer,所有函数自动统计。再也不用到处复制粘贴那几行计算时间的代码了。
有个同事看我改完的代码,问我是不是删了太多东西。我说没删,就是用装饰器把共用的功能包起来了。他当时就说,这玩意儿真能省事。后来他自己写了个缓存装饰器,把数据库查询结果缓存起来,接口速度翻了一倍。
说实话,以前我觉得装饰器是高级玩法,看着就头疼。真上手才发现,装饰器其实就是个函数包装机。你写一个通用的外壳,想给哪个函数套上就套上。不改函数本身,也不影响其他地方调用。
我现在写新功能的时候,会先想想哪些部分是可以抽出来的通用逻辑。日志、权限、缓存、重试,这些都可以做成装饰器。函数只管自己的核心事情,外围的事情交给装饰器。代码读起来也轻松,维护成本肉眼可见地降下来了。
昨天又优化了几个老函数,用装饰器替换掉里面乱七八糟的判断逻辑。改完测试通过,代码行数少了一半。项目经理跑过来问我是不是偷偷重写了。我说不是,就加了几行装饰器代码。他看着精简后的代码,说了句,这才是该有的写法。
装饰器这东西,用好了真能解放双手。你不用在每个函数里重复造轮子,一个装饰器搞定一类公共需求。代码量少了,逻辑清楚了,写代码的心情都变好了。不信你找个函数多的项目试试,保证你用了就回不去。