[네이버 지식백과]builder 패턴 (쉽게 배우는 소프트웨어 공학, 2015. 11. 30., 한빛아카데미(주))
Builder 패턴을 공부해 봅시다. 이해하기 좀 어려울 수도 있겠는데요, 각각의 구현은 다르지만 기능은 같은 객체들을 관리하는 관리자를 만드는 패턴입니다. 사용자 즉 main 함수에서는 객체를 만들 뿐 기능을 사용하기 위해 직접 호출하지 않고 관리자를 통해서만 일 처리를 합니다.
이번에는 Key(버튼) 처리하는 기능으로 예제를 만들어 봤습니다. 언제가 꼭 해보고 싶었던 예제인데요, firmware에서는 참 많이 쓰이는 기능입니다. Key 처리 기능은 하드웨어가 바뀌면서 프로젝트마다 바뀔 소지가 있습니다. 단순 1:1 GPIO를 사용할 수도 있고 ADC를 사용할수도 있습니다. 혹은 1:N 매트릭스 GPIO를 사용할 수도 있습니다. 아니면 세가지 다 사용할 수도 있겠지요.
주의할 점은 어떠한 하드웨어 Key를 사용하더라도 이용하는 측면에서는 코드의 변화가 없어야 합니다. 그래야 유지보수 및 확장성이 용이하겠지요?
그럼 먼저 헤더에 Key interface 와 관리자 함수를 만들어 보도록 하겠습니다. C에서는 interface가 없기 때문에 아래처럼 structure를 사용합니다. 관리자 함수는 27번 줄의 setup_key 하나입니다. Key는 총 3개를 받게 되어 있는데, 이는 필요에 따라서 늘리면 됩니다.
Key interface인 key_t자료형은 각각의 Key 객체에서 구체적으로 구현해야 합니다. 이번 예제에서는 GPIO, ADC 두가지 객체를 만들어 보도록 하겠습니다. 먼저 ADC Key 객체 헤더입니다.
한 줄입니다. main에서 이 함수를 호출해서 key_t 포인터를 key 관리자 함수 setup_key에 넘겨주면 됩니다. 이번엔 ADC Key 객체 구현 코드를 살펴보겠습니다. 20번 줄 setup_key_adc를 호출하면 ADC key 객체의 포인터를 넘겨줍니다. 그럼 Key 관리자는 지속적으로 어느 키가 눌렸는지 45번 줄의 get_key_pushed를 통해서 체크 합니다.
45번 줄의 get_key_phushed에 각각의 하드웨어에 맞는 구체적인 코드가 들어 가면 됩니다. Key 관리자는 주기적으로 어느 키가 눌렸는지 체크해야 하는데요, 이를 위해 지난번에 만든 timer를 사용하도록 하겠습니다. 다음은 Key 관리자코드 입니다. 먼저 등록된 Key 객체를 assign해주고 init()함수를 호출한 다음 timer를 하나 동작 시킵니다.
관리자의 등록된 키를 50msec 주기로 체크하는 scan함수가 있습니다. 32번 줄의 scan 함수에서는 등록된 객체의 get_key_pushed 함수를 실행시켜 KEY_NONE이 아니면 message에 MSG_TEST_1과 눌린 Key의 명칭을 전달 하도록 하고 있습니다. 이제 main 무한루프를 보도록 하겠습니다.
지난번에 만든 scheduler를 사용하고 있습니다. 메시지 process를 만들어 메시지를 받았을 때 처리하는 부분이 따로 분리되어 있습니다. 우선 setup_key 함수를 통해서 adc key 객체를 주면 끝입니다. 그럼 Key 관리자에서 주기적으로 Key를 체크해서 눌렸으며 메시지에 전달하고 메시지 process에서는 40번 줄 처럼 눌린 키 정보에 따라 처리를 해주면 됩니다.
아참, GPIO를 사용한 key 객체도 보여드리도록 하겠습니다. adc와 거의 비슷한데 직접 GPIO를 체크하는 부분은 넣으시면 됩니다. 50msec 마다 눌렸다 떼었다는 체크하기 때문에 채터링은 크게 신경쓰지 않으셔도 됩니다.
먼저 GPIO key 객체의 헤더입니다.
ADC key 객체와 동일합니다. 이제 본체를 보겠습니다. 이것도 거의 동일합니다. 아마 직접 구현하신다면 get_key_pushed의 구체적인 구현만 달라지겠네요.
이렇게 해서 builder 패턴을 알아봤습니다. 지금은 strategy 패턴과 다를게 없어 보이는데, Key 관리자 현재는 하나의 Key 객체만 받도록 설계가 되어 있어서 그렇습니다. 여러개의 Key 객체를 받도록 수정하면 builder 패턴을 좀 더 잘 이해 하실 수 있을 겁니다.
'▶ 이전글 > C Pattern' 카테고리의 다른 글
C의 app 만들기 - 2 : main에서 실제 사용하기 (0) | 2018.01.25 |
---|---|
C의 app 만들기 - 1 : app manager (0) | 2018.01.24 |
facade 패턴 (0) | 2018.01.11 |
Message 기반 만들기 (0) | 2018.01.11 |
Timer 만들기 (0) | 2018.01.11 |