Функция с несколькими логическими условиями или несколькими функциями? - PullRequest
4 голосов
/ 01 мая 2020

Я пытаюсь определить модуль 'util' для моего проекта, где основной утилитой является функция 'display windows' (в данном случае opencv):

def display_windows(windows_to_display, with_text=False):
    for window_tag, window in windows_to_display:
        cv2.imshow(window_tag, window)

В дополнение к Основа c 'дисплей', я хочу иметь несколько опций, скажем

  1. Добавить текст в окно (cv2.putText ()

  2. Подождите после отображения windows (cv2.waitKey ())

  3. Уничтожить windows (cv2.destroyAll Windows ()) et c

Мне интересно, как подойти к этому, один вариант - добавить несколько логических значений со значениями по умолчанию, а затем получить что-то вроде:

def display_windows(windows_to_display, with_text=False, with_wait=False, destroy_first=False):
    if destroy_first:
        cv2.destroyAllWindows()
    for window_tag, window in windows_to_display:
        if with_text:
            cv2.putText(window, 'text', ...)
        cv2.imshow(window_tag, window)
    if with_wait:
        cv2.waitKey(0)

В качестве альтернативы, я мог бы объявить несколько функций, используя «base» 'display windows', а затем добавить, скажем:

def display_windows_and_wait(self, windows_to_display, with_text=False, destroy_first=False):
    display_windows(windows_to_display, with_text)
    cv2.waitKey(0)

et c.

Я не совсем доволен ни одним из вариантов; переходя к логическому подходу, я не большой поклонник того, чтобы:

display_windows(windows, True, True, True)

разбросано по кругу, поскольку это не очень информативно.

При использовании подхода с несколькими функциями, ну, не уверен, что Это действительно помогает.

Есть мысли о том, какой подход улучшил читабельность? Или еще лучше, есть ли лучший способ подойти к этому вопросу?

Большое спасибо

1 Ответ

2 голосов
/ 01 мая 2020
  1. Вместо вызова

    display_windows(windows, True, True, True)
    

    вы все равно можете использовать ключи в аргументах:

    display_windows(windows, with_text=True, with_wait=True, destroy_first=True)
    
  2. Сначала вы можете определить некоторые константы и затем используйте их:

    WITH_TEXT = True         # possibly also NO_TEXT = False, NO_WAIT = False, etc.
    WITH_WAIT = True
    DESTROY_FIRST = True
    
    display_windows(windows, WITH_TEXT, WITH_WAIT, DESTROY_FIRST)
    
  3. Вы можете использовать только 1 параметр с битами в качестве флагов:

    WITH_TEXT = 0b001
    WITH_WAIT = 0b010
    DESTROY_FIRST = 0b100
    

    Пример вызова вашей функции:

    display_windows(windows, WITH_TEXT|DESTROY_FIRST)
    

    и изменение определения вашей функции:

    def display_windows(windows_to_display, flags=0):
        if flags & DESTROY_FIRST:
            cv2.destroyAllWindows()
        # and so on
    

    Преимущество этого - при вызове вашей функции:

    1. flags (во втором параметре) может быть в * произвольном порядке, *
    2. флаги со значением False просто опущены.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...