OpenCV

[OpenCV] 코드 리팩토링을 했다.

선호하는 2024. 12. 30. 08:00

서론

키 입력을 받는 부분에서, 반복되는 부분이 보이길래 통합을 해 버렸다. 트리거 검증과 이벤트 실행을 나중에 분리하려고 생각했었는데, 지금 리팩토링을 해서 구조를 바꿔버리는게 성급했던 결정은 아닌가 걱정이 된다.
지금 당장은 필요하다고 생각되는 부분이였고, 간단한 수정이였기 때문에 강행했지만, 다음 번에 복잡한 코드를 리팩토링 할 때는 더 신중한 자세로 진행해야겠다 생각했다.

진행 내용

  1. 이전 코드

    trigger_ = index_finger_mcp_y < index_finger_tip_y
    if trigger_ and press_['q']:
        pyautogui.press('q')
        press_['q'] = False
    elif not trigger_ and not press_['q']:
        press_['q'] = True
    
    trigger_ = middle_finger_mcp_y < middle_finger_tip_y  
    if trigger_ and press_['w']:  
        pyautogui.press('w')  
        press_['w'] = False  
    elif not trigger_ and not press_['w']:  
        press_['w'] = True
    
    trigger_ = ring_finger_mcp_y < ring_finger_tip_y  
    if trigger_ and press_['e']:  
        pyautogui.press('e')  
        press_['e'] = False  
    elif not trigger_ and not press_['e']:  
        press_['e'] = True
    
    trigger_ = pinky_mcp_y < pinky_tip_y  
    if trigger_ and press_['r']:  
        pyautogui.press('r')  
        press_['r'] = False  
    elif not trigger_ and not press_['r']:  
        press_['r'] = True

트리거 검증 + 중복 확인 -> 이벤트 발동의 구조로 이루어진 6줄이 반복되는 걸 볼 수 있다.
그래서 이걸 하나의 함수로 만들어 버렸다.

  1. 이후 코드

     class Event:  
         def **init**(self, point_1: float, point_2: float, key: str):  
             self.point_1 = point_1  
             self.point_2 = point_2  
             self.key = key
    
     def check_event(event: Event) -> None:  
       global press_  
       trigger_ = event.point_1 < event.point_2  
       if trigger_ and press_[event.key]:  
           pyautogui.press(event.key)  
         press_[event.key] = False  
       elif not trigger_ and not press_[event.key]:  
           press_[event.key] = True  
       return None
    
     # ---------------------------------------------------------
    
     check_event(Event(point_1=index_finger_mcp_y, point_2=index_finger_tip_y, key='q'))  
     check_event(Event(point_1=middle_finger_mcp_y, point_2=middle_finger_tip_y, key='w'))  
     check_event(Event(point_1=ring_finger_mcp_y, point_2=ring_finger_tip_y, key='e'))  
     check_event(Event(point_1=pinky_mcp_y, point_2=pinky_tip_y, key='r'))

    첫째로, input 데이터 검증을 위한 타입 Event를 선언해 줬다.
    그 다음 check_event 함수에서 중복 확인을 위한 dict 형식의 변수 trigger_를 함수에서 불러오고, 앞서 확인한 반복 구조를 변경해 주었다.
    추후에 예외 처리를 추가해서 더 안정적인 코드로 만들 것이다.