Сокращение кода пахнет помощи от граждан первого класса
фото Мэй Му на Неспособный
Недавно я столкнулся с ситуацией, где Элиф
сложены друг на друга, как блины. Например, мы анализируем разные форматы файлов. Наши анализаторы готовы, и нам просто нужен интерфейс более высокого уровня.
if file_format == 'xml': parse_xml(file_name) elif file_format == 'csv': parse_csv(file_name) elif file_format == 'json': parse_json(file_name) else: parse_txt(file_name)
Сначала были просто Если
и иначе
Анкет Затем все начало складываться, и я понял, что несколько Элиф
Был просто пахнущий кусок кода.
Чтобы справиться с этим, мы можем использовать концепцию Python, которая функционирует, являются первоклассными гражданами. Это означает, что мы можем вернуть их или использовать их в качестве словарных значений. Таким образом, нам нужно сопоставить наши форматы файлов с соответствующими функциями анализа:
parsers = { 'xml': parse_xml, 'csv': parse_csv, 'json': parse_json, }
Обратите внимание, что я не включил наш анализатор TXT по умолчанию. Как будто мы переписываем Если
и Элиф
нашего предыдущего кода. Теперь нам нужна функция, чтобы вернуть анализатор для данного формата файла:
def get_parser(file_format): return parsers.get(file_format, parse_txt)
Это вернет функцию анализатора из нашего Парсеры
Словарь для данного формата файла. Или, если file_format
не является ключом этого словаря, по умолчанию parse_txt
Анкет В качестве аналогии раньше, как будто мы переписываем последний иначе
утверждение.
Чтобы использовать это, нам нужно позвонить get_parser
функция И мы также можем немедленно выполнить это:
get_parser('csv')(file_name)
Но если вы хотите быть более прозрачным, вы можете расширить это до нескольких строк:
parser = get_parser('csv') parser(file_name)
Я думаю, что этот код выглядит лучше, чем в начале статьи, хотя может быть не очевиден для всех, поэтому не забудьте разместить несколько комментариев:)
И я хочу верить, что это работает немного быстрее, потому что мы просто получаем ценность от словаря вместо того, чтобы проверять каждое отдельное Если
кейс.
Оригинал: “https://dev.to/c_v_ya/reducing-code-smelling-with-a-help-from-first-class-citizens-14ca”