Название не совсем понятно, у меня проблемы с формулировкой проблемы правильно, но, возможно, пример поможет.
Допустим, я реализовал сервис заданий в python. Это сервер, который принимает опубликованные данные, которые содержат определение задания и выполняет задание. Сервер имеет только набор заданий, которые он может выполнять, все остальное недопустимо и требует, чтобы вызывающая сторона возвратила ошибку.
JOB_TYPE_1 = "job_type_1"
JOB_TYPE_2 = "job_type_2"
JOB_TYPE_3 = "job_type_3"
VALID_JOB_TYPES = [JOB_TYPE_1, JOB_TYPE_2, JOB_TYPE_3]
def run_job(job_type, payload):
if job_type not in VALID_JOB_TYPES:
raise ValueError("invalid job_type value")
elif job_type == JOB_TYPE_1:
run_job_type_1(payload)
elif job_type == JOB_TYPE_2:
run_job_type_2(payload)
elif job_type == JOB_TYPE_3:
run_job_type_3(payload)
@get("/api/job", method=['POST'])
def accept_post():
payload = request.json
job_type = request.vars.get('job_type')
run_job(job_type, payload)
Звонящий может сделать что-то вроде
payload = dict(some_key="some_value")
requests.post("https://localhost/api/job?job_type=job_type_1", json=payload)
Так что это работает. А именно это
- назначает значимые строки именам заданий, поэтому вызывающему не требуется доступ к перечислениям исходного кода
- содержит имена заданий, хранящиеся в переменных, поэтому у нас нет магических строк, лежащих вокруг исходного кода (по крайней мере, исходного кода обработки задания)
- проверяет, является ли тип задания действительным
job_type in VALID_JOB_TYPES
).
Проблема в том, что ... это кажется неправильным. Кажется, должна быть какая-то структура, похожая на перечисление, которая может справиться с большей частью этой логики.
Я знаю, что у python есть перечисления, и я мог бы сделать что-то вроде этого
def JobType(Enum):
JOB_TYPE_1=1
JOB_TYPE_2=2
JOB_TYPE_3=3
Проблема в том, что тогда
- У меня нет способа проверить, является ли входящее значение
job_type
допустимым перечислением JobType
, нет оператора if job_type in JobTypes
.
- Вызывающий мой сервис не имеет доступа к этому перечислению, поэтому он застрял либо переопределив его самостоятельно, либо отправив по волшебным номерам (т. Е.
1
для JOB_TYPE_1
и т. Д.), Чтобы указать, какую работу он хочет бежать.
Итак, в идеале, у меня был бы способ определения перечисления, которое отображается на значащие строки и позволяет мне сравнивать любую случайную строку с перечислением, чтобы убедиться, что она сама является допустимым типом задания.