C++ 프로그램 디자인 하기

Fuji ㅣ 2022. 11. 15. 00:05


C++ 에 적합한 디자인 방법

  • 도움을 요청한다: 동료나 멘토, 책, 뉴스그룹, 웹 페이지등에서 조언을 구한다.
  • 잠시 다른 일에 몰두한다: 나중에 다시 디자인 작업을 이어서 한다.
  • 일단 결정을 내리고 다음 단계로 나아간다: 차선책이더라도 결정을 내리고 그 방식으로 밀어붙여본다. 결정이 잘못됐다면 금세 드러나기 마련이기 때문이다. 막상 해보면 좋은 방식이 될지도 모른다. 만약 당장 요구사항을 만족하면서 실제로 적용할 수도 있는 최적의 방법이 아무리 생각해도 떠오르지 않는다면 어설픈 솔루션이라도 적용해둔다. 이때 다른 사람 뿐만 아니라 본인도 이러한 결정을 내린 이유를 알 수 있도록 구체적인 내용을 문서에 기록해둔다. 생각해봤지만 채택하지 않은 디자인에 대해서도 그 이유와 함께 문서에 남겨야한다.

 

 

코드 재사용

C++ 프로젝트를 구성하는 코드를 무작정 처음부터 작성하지 않는다. 표준 라이브러리, 오픈소스 라이브러리, 회사에서 구매한 상용 코드, 예전 프로젝트에서 작성했던 코드를 비롯하여 다양한 소스를 최대한 활용하자. 그러기 위해선 주어진 디자인에서 코드를 자유자재로 활용할 수 있어야 한다. 이 원칙을 최대한 적용하려면 재사용할 수 있는 코드의 형태와 코드를 재사용할 때의 장단점을 명확히 파악해야 한다.

코드 재사용이란 단순히 기존 코드를 복사해서 붙이는 것이 아니다. 이와 정반대로 일일이 복제하지 않고도 코드를 재사용할 수 있어야 한다.

 

 

 

재사용되는 코드의 유형

  • 독립 함수, 클래스 : 자신 또는 동료가 작성한 코드는 보통 이런 형태로 재사용된다.|
  • 라이브러리 : XML을 파싱하거나 암호화같은 특정한 작업을 처리하는 데 필요한 코드를 한데 묶은 것을 뜻한다. 스레드와 동기화를 지원하거나 네트워킹, 그래픽 작업에 특화된 기능도 라이브러리로 구성하는 경우가 많다.
  • 프레임워크 : 디자인할 프로그램의 기반이 되는 코드를 모아둔 것이다. MFC또한 윈도우용 GUI 프레임워크이다. 
  • API : API는 특정한 기능을 수행하는 코드나 라이브러리에 대한 인터페이스이다. 네트워크 프로그래밍에서 사용되는 소켓 API를 예로 들 수 있다. 이는 인터페이스만 제공된다.
프로그램은 라이브러리를 활용하고, 프레임워크에 맞게 작성한다. 다시 말해 라이브러리는 특정한 기능을 제공하는 반면에 프레임워크는 프로그램의 디자인, 구조에 대한 토대 및 기반을 제공해준다

 

 

 

 

재사용 장점 

  • 필요한 코드를 처음부터 새로 작성한 코드보다 훨씬 다양한 에러 상황에 대응되도록 작성됐을 경우가 많다. 재사용할 수 있도록 제공되는 라이브러리는 대부분 엄격한 테스트를 거치고 수많은 프로그래머가 검증했기 때문에 발생할 수 있는 에러는 상대적으로 적을 수 있다.
  • 자신이 직접 작성한 코드보다 해당 분야 전문가가 작성한 코드를 사용하는 것이 상대적으로 안전하다. 보안 전문가가 아니라면 보안 코드를 직접 작성하지 않는 편이 안전한 것을 예로 들 수 있다. 프로그램에 보안 또는 암호화 기능이 필요하다면 이러한 기능을 제공하는 라이브러리를 활용해보자. 얼핏 보기에 사소한 부분이더라도 제대로 처리하지 않으면 그 프로그램뿐만 아니라 시스템 전체에 보안 취약점이 생길 수 있다.

재사용 단점

  • 프로그램 모든 부분을 자신이 직접 작성했다면 동작을 정확히 파악할 수 있다. 하지만 다른 사람이 작성한 라이브러리를 사용하면 먼저 그 라이브러리에서 제공하는 인터페이스를 파악하고 올바른 사용법을 익히는데 시간이 걸린다. 이러한 학습 오버헤드로 인해 프로젝트 초반에 디자인과 코딩 속도가 느려질 수 있다.
  • 코드를 직접 작성하면 자신이 원하는 동작에 딱 맞게 구현할 수 있다. 반면 라이브러리는 불필요한 기능이 다소 포함될 가능성이 있다.
  • 라이브러리에서 자신이 원하는 기능을 정확히 제공하더라도 원하는 만큼 성능이 나오지 않을 수 있다. 성능을 예측하기 어렵다.
  • 라이브러리 코드를 사용하면 유지 보수에 문제가 발생할 수 있다. 라이브러리의 소스 코드에 직접 접근할 수 없는 경우가 많은데, 그런 라이브러리에서 버그가 발생하면 직접 고치고 싶어도 고칠 수 없다. 라이브러리 작성자가 일정에 맞게 버그를 고쳐준다는 보장도 없다. 또한 현재 제품에 대한 지원을 중단하기도 전에 그 제품에서 상당히 의존하는 라이브러리의 지원이 중단되면 난감해지는 상황도 발생한다. 그러므로 소스코드가 제공되지 않는 라이브러리를 사용할 때는 이런 사항을 면밀히 검토하자.
  • 크로스 플랫폼 호환성 관련 문제도 발생할 수 있다. 구현하려는 애플리케이션을 여러 플랫폼에서 구동하게 만들려면 라이브러리또한 크로스 플랫폼을 지원하는 것을 선택해야한다.

 

 

 

판단 기준 세우기

코드 재사용 여부는 주어진 상황과 목적에 따라 판단하자. 직접 작성하는 데 걸리는 시간과 주어진 문제를 적절하게 해결해주는 라이브러리를 찾아서 사용법을 익히는데 걸리는 시간을 잘 비교해서 결정하자. 

  1. 멀티스레드 프로그램에서 사용해도 안전한지 파악하자
  2. 라이브러리를 사용하는 코드에 특별히 컴파일러 설정해야할 사항이 있는지, 프로젝트 전체에 적용해도 문제가 없는지 면밀히 파악하자.
  3. 초기화나 종료 시 반드시 수행해야할 작업이 있는지 파악하자
  4. 사용할 라이브러리나 프레임워크에서 의존하고 있는 라이브러리가 있는지 체크하자
  5. 함수가 메모리 포인터를 리턴할 때 그 메모리를 해제하는 작업을 호출한 코드와 라이브러리 중 어느 쪽이 책임져야하는지 파악하자. 스마트 포인터를 사용할 수 있는지 여부도 체크하자
  6. 라이브러리를 호출할 때 어떤 에러 조건을 확인해야하는지, 어떤 상황을 가정하는지 파악해보자. 만약 에러를 팝업 메세지를 띄워 알려주거나, stderrr/cerr 나 stdout/cout로 전달하거나, 아무런 메세지 없이 프로그램을 종료시켜버리는 라이브러리는 피한다.
  7. 함수에서 리턴하는 값이나 레퍼런스를 모두 파악해둔다.
  8. 함수에서 발생하는 익셉션 모두를 파악해둔다.