魔法数字的危害
最近在项目中看到大量魔法数字的使用,像下面这段代码:
if task.status < 3 and task.task_jobs.filter(status__in=(2, 3, 4, 5)).count() == total_jobs:
if task.task_jobs.filter(status__in=(2, 3)).exists():
self.update_task(task.id, 3)
可以看到状态中大量使用了数字,而对于代码的读者来说,如果不明白这些数字代表的状态,很难搞懂代码的含义。
然而在大量使用魔法数字后,它的危害就不仅仅是难以理解了。
当需要修改某个状态时,想要找到所有使用这个状态的地方,只能搜索数字,而单个数字仅在一个文件中就出现了30多次。
结果就是只能在大量的搜索结果中逐一排查,代码维护效率非常低。
解决#
通过使用枚举类型,将各个状态定义到枚举中。
class TaskStatus(IntChoice):
NOT_START = 1
WAITING = 2
RUNNING = 3
VALIDATING = 4
COMPLETE = 5
FAILED = 6
tasks = Task.objects.filter(
status__in=(TaskStatus.WAITING, TaskStatus.RUNNING, TaskStatus.VALIDATING),
update_time__gte=last_hour).all()
使用枚举后,想要查询某个状态在代码中什么地方使用,只需要搜索枚举名称就可以了。