魔法数字的危害

最近在项目中看到大量魔法数字的使用,像下面这段代码:

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()

使用枚举后,想要查询某个状态在代码中什么地方使用,只需要搜索枚举名称就可以了。

comments powered by Disqus