facade 패턴


[네이버 지식백과] facade 패턴 (쉽게 배우는 소프트웨어 공학, 2015. 11. 30., 한빛아카데미(주))


프로그램 디자인 패턴은 문법이 아닙니다. 따라서 하나의 패턴으로 프로그램 전체를 완성시킬 수는 없습니다. 그리고 완벽하게 룰을 지키는 패턴도 필요없구요. 상황에 따라 여러 패턴들을 조금씩 응용해서 사용할 뿐입니다. 너무 복잡한 패턴은 굳이 쓸 필요가 없습니다. 오히려 유지보수 혹은 한 프로젝트에 다수의 개발자가 존재할 경우 코드를 이해하지 못하는 경우가 발생할 수 있습니다 또한 인수인계 발생시에 왜 이런 패턴을 구현했는지 잘 설명해줘야 합니다. 안그러면 좋은 구조로 잘 설계된 프로그램이 타인에 의해 조금씩 붕괴되는 광경을 목격하실 겁니다.


보통 알고리즘을 사용할 때 복잡한 절차가 있게 마련입니다. 대부분 메모리 할당이라든가, callback 할당등 복잡해지기 쉽습니다. 그런데 이러한 절차들이 main 한 군데에 집중 된다면 코드를 이해하기 어려려울 뿐 만 아니라 유지보수도 어려워 집니다. 


Facade 패턴은 다양한 알고리즘 군을 분리해서 그 절차대로 진행해주는 역할을 합니다. 그러면 유지보수를 할때 해당 facade만 보면 되니 유지보수도 쉬워지고 코드도 이해하기 쉬워집니다. 또한 main 코드를 건드리지 않고 기능을 개선하거나 추가, 변경 할 수 있게됩니다. 


main 부터 살펴보겠습니다. 상당히 간단하네요. 여기서는 하나의 알고리즘군(한개의 목표를 수행하는 기능 집단)을 대표해서 facade라는 기능이 추가되었습니다. 



그럼 facade의 헤더를 보겠습니다. 지금까지 제 글을 보셨다면 헤더가 interface라는 것을 아시리라 생각됩니다. 



두가지 structure가 있습니다. algorithm_t는 실제 콘크리트 알고리즘을 위한 것이고 facade_algorithm_t는 facade를 위한 것입니다. main에서 setup_algorithm을 호출하면 facade의 facade_algorithm_t의 pointer를 넘겨주게 됩니다. 


이제 facade 소스를 보겠습니다. 이전과는 다르게 this를 초기화 함수내에서 초기화하지 않고 선언과 동시에 했습니다. 미묘한 차이가 있으나, 나중에 설명하도록 하겠습니다. setup_algorithm을 하면 facade 객체 pointer를 넘겨줍니다.



이전 main에서는 위 코드의 init, start, stop을 호출하게 되는데 실제로는 algorithm1, algorith2 알고리즘 군의 함수를 수행하는게 됩니다. 위의 예제는 init이 상당히 단순한데 실제로는 다양한 절차들이 들어갈 수 있습니다. 여기를 수정하시거나  algorithm1, algorith2 의 실제 구현 코드에서 절차들을 수정하면 됩니다. 그럼 main은 수정을 안해도 되겠지요. 


그럼 이제 algorithm1 코드를 보도록 하겠습니다. 먼저 헤더입니다. 생소한 #ifndef가 나오네요. C의 전처리기 중 하나인데요, FACADE_ALGORITHM1_H_ 가 #define 안되어 있다면 #define 하는 명령어 입니다. 이렇게 선언해 놓으면 setup_algorithm1이 중복선언되었다는 에러는 발생하지 않게됩니다. 한번만 선언되는 꼴이니깐요. 


아래 코드를 설명하자면 setup_algorithm1 호출해 algorithm_t의 포인터를 넘겨주는 함수입니다. 즉 실제 알고리즘의 포인트를 얻어와 사용하겠다는 의미이지요.




그럼 algorithm1 을 실제 구현 해 보도록 하겠습니다. 간단하지요? 실제 구현할 사항이 있으면 아래 코드를 채워 넣으면 됩니다. 



algorithm2의 코드도 동일합니다. 실제 구현부분은 달라지겠지요.



facade 패턴은 C에서 정말 필요한 패턴입니다. C는 메모리에 한해서 동적이지 못하고 절차를 중요하게 생각하기 때문에 코드가 많아지는게 필연적입니다. main에는 코드가 무조건 많아서는 안됩니다. 객체지향 언어의 프로그래밍보다 더 구조적으로 작성해야 생산성 및 유지보수 확장성이 용이해 집니다. 오히려 더욱 더 조심해서 코딩해야 합니다.
















'▶ 이전글 > C Pattern' 카테고리의 다른 글

C의 app 만들기 - 1 : app manager  (0) 2018.01.24
Builder 패턴  (0) 2018.01.17
Message 기반 만들기  (0) 2018.01.11
Timer 만들기  (0) 2018.01.11
Scheduler 구현하기  (0) 2018.01.11