2015-10-08 2 views
1

У меня есть функция с именем getTicket которые принимают два аргумента идентификатор, который является номером и формат (строка)проектирование мой апи билет

def getTicket(id, format): 
    if format == "pdf": 
     getTicketPDF(id) #some specialized pdf method gets called 
    elif format == "json": 
     getTicketJSON(id) #specialized json method 

Теперь, если я должен поддерживать некоторый новый формат как «HTML», то я могу создайте еще один elif для html.

Но я хочу обобщить этот код так, что если в будущем п новый метод добавляется я не должен изменить мой код

Как я могу создать мою getTicket апи?

ответ

2

Вы можете создать словарь, который хранит format функционировать отображение, как "pdf" отображения функционировать getTicketPDF и т.д. И тогда в вашей getTicket() функции вы вызываете ценность словаря для format и назвать его пропускание id параметра к нему. Пример -

funcdict = {"pdf":getTicketPDF 
      "json":getTicketJSON} 
def getTicket(id, format): 
    try: 
     funcdict[format](id) 
    except KeyError: 
     #Handle case where format is not found in dictionary 

Если позже вы решите добавить новую функцию для нового формата, вам просто нужно добавить новое отображение в словарь.

+0

Просто интересно, возможно ли, что у меня может быть какой-то полиморфизм времени выполнения, чтобы обнаружить тип и вызвать последующий api? – rahulshr

+0

Хмм, о каком полиморфизме времени выполнения вы думаете? –

+0

Я думал унаследовать getTicketPDF и getTicketJSON от getTicket, но это также необходимо сохранить, если конд ... ответ, который вы упомянули, похоже, удовлетворяет моему требованию. Спасибо. – rahulshr

0

В вашем случае используется стратегия создания шаблона стратегии (PDF/JSON/HTML), которая использует шаблон Factory для получения правильного класса реализации стратегии. Вот шаги высокого уровня -

  1. Отдельные функциональные возможности генерации билета в классе TicketGenerator. Пусть это будет интерфейс. Он будет иметь один абстрактный метод generateTicket()
  2. Используйте TicketGeneratorFactory, чтобы получить правильный экземпляр TicketGenerator, основанный на типе билета, например экземпляр PDFTicketGenerator, JSONTicketGenerator, HTMLTicketGenerator и т. Д. Каждый из этих классов реализации имеет generateTicket() в соответствии с типом, т.е. PDF/JSON/HTML.
  3. Этот экземпляр должен быть присвоен базовому типу TicketGenerator.
  4. TicketGenerator.generateTicket() предоставит вам билет в желаемом формате - PDF/JSON/HTML.
+0

Я попытаюсь реализовать это решение .. – rahulshr

Смежные вопросы