Как определить экземпляр в зависимости от некоторой переменной? - PullRequest
0 голосов
/ 08 февраля 2020

Я дам код на Python, но это не важно. У меня есть модуль argument_parser со словарем и классом:

FORMATS = {
    'JSON': 'json',
    'XML': 'xml',
}

class ArgumentParser:
    # some methods
    def parse():
        """returns 'XML' or 'JSON' string"""
        return fomat

и модуль с докладчиками - presenter

class JSONPresenter:
    # some magic


class XMLPresenter:
    # some magic

Проблема заключается во внедрении зависимости:

argument_parser = ArgumentParser()
format = argument_parser.parse()

if format == argument_parser.FORMATS['JSON']:
    presenter = JSONFilePresenter()
elif format == argument_parser.FORMATS['XML']:
    presenter = XMLFilePresenter()

if-elif конструкция безобразна. Если я хочу добавить другие форматы, я должен добавить еще elif. Я мог бы определить тип докладчика в ArgumentParser классе, но я думаю, что семантически это неправильно - это не сфера ответственности этого класса. Что я должен сделать, чтобы сделать это правильно?

1 Ответ

1 голос
/ 08 февраля 2020
PRESENTERS = {
    'json': JSONPresenter(),
    'xml': XMLPresenter(),
}

argument_parser = ArgumentParser()
fmt = argument_parser.parse()
presenter = PRESENTERS[fmt]

Или, если вам каждый раз нужен новый докладчик:

PRESENTERS = {
    'json': lambda: JSONPresenter(),
    'xml': lambda: XMLPresenter(),
}

argument_parser = ArgumentParser()
fmt = argument_parser.parse()
presenter = PRESENTERS[fmt]()
...