본문 바로가기

프로그래밍

[펌] 코드 정리 하기

출처: 온라인서버제작자모임


코드 정리를 부탁드립니다.

무의미하게 나열되거나, 주석이 정신없이 달려 있거나, 수천줄의 코드가 하나의 파일안에 나열되어 있는 그런 코드를 당신이라면 보고 싶겠습니까. 아마 누구도 원하지 않을 것입니다. 만약 당신이 돈을 받고 일을 하고 있으면서 동료들과 코드를 공유하고 있다면 이런 행위는 명백한 동료들에 대한 배신(?)일 수도 있습니다..

단순한 정리보다는 의미있게, 많은 양의 코드라면 어떤식으로 정리해야 할 지.. 코드 정리에 표준 규칙이란게 존재하지는 않지만 개인적으로 괜찮다고 생각하는 방식을 이곳에 나열해 볼까 합니다.

당신의 동료는 무엇을 당신의 코드에게 원하는가

  • 제작된 코드에 대한 빠르고 명확한 파악을 원합니다.

  • 자신이 필요한 부분을 쉽게 찾을 수 있길 원합니다.

  • 하나의 파일에 수천, 수만 줄의 코드가 나열되어 있기 보다는 주제별 cpp 파일로 나뉘어져 있길 원하며, 코드 파악이 쉽고 파일명으로도 쉽게 역할을 추측할 수 있길 원합니다.

  • 하지만 각자의 코드 스타일이 극명할 경우 서로간의 존중 또한 필요하다고 생각됩니다.

무엇을 중심으로 정리해야 하는 것인가

  • 기능에 대한 분류가 가장 우선 순위가 되어야 합니다.
  • 불필요하게 긴 주석보다는 간격하게 정리된 주석. 가능한 주 기능에 대한 설명은 헤더 파일에 기록합니다.

코드 작성시 규칙

  • 맴버 변수에 대해서는 가능한 public으로 공개하지 않는다.
  • 함수의 첫번째 단어는 소문자로 시작한다.
  • private 함수는 __를 함수명 앞에 붙인다.
  • protected 함수는 _를 함수명 앞에 붙인다.
  • enum값의 정의를 할 때 코드 전반에 관련된 내용은 pre define header에 정의하며, 만약 특정 클래스에 국한된 값이라면 항상 클래스 내부에 정의한다.
  • 인자의 이름앞에는 _를 붙인다.

간단한 예제 클래스를 나열하여 마무리를 해볼까 합니다. 아래 예제는 이런 식으로 정리를 하자는 의견이니 보시고 코드 제작에 참고하시기 바랍니다.

  1. <ITriggerPackList.h>
  2. class ITriggerPackList//하나의 완성된 트리거를 관리하기 위한 클래스
  3. {
  4. //////////////////////////////////////////////////////////////////////////
  5. //define
  6. public:
  7. enum
  8. {
  9. eTriggerType_1 , // 예제 1
  10. eTriggerType_2, // 예제 2
  11. };
  12. //////////////////////////////////////////////////////////////////////////
    //초기화
  13. public:
  14. ITriggerPackList();
  15. virtual ~ITriggerPackList();
  16. void destroy();
  17. //////////////////////////////////////////////////////////////////////////
  18. //save/load - simplebuffer 클래스 리펙토링 한 이후에 아래 코드 수정할 것!
  19. public:
  20. void load( FILE* _fp );
  21. void save( FILE* _fp );
  22. //////////////////////////////////////////////////////////////////////////
  23. //정보 수정
  24. protected:
  25. void _setName(dSTD_STRING _strName){ m_strStepName = _strName;}
  26. BOOL _add( cTriggerPack* _pData );
  27. BOOL _add( dSTD_STRING _name = dSTRING_EMPTY);
  28. void _del(dSTD_STRING _name);
  29. void _del(cTriggerPack* _pData);
  30. private:
  31. void __test();
  32. public:
  33. void del(int _idx);
  34. //////////////////////////////////////////////////////////////////////////
  35. //정보 검색 및 요청
  36. public:
  37. cTriggerPack* getByName( dSTD_STRING _value);
  38. cTriggerPack* getByIdx( u4 _value);
  39. cTriggerPack* getByCounter( u4 _value );
  40. u4 size(){ return m_listTriggerPack.size(); }
  41. //////////////////////////////////////////////////////////////////////////
  42. //실직적인 트리거 처리
  43. public:
  44. s4 query();
  45. //////////////////////////////////////////////////////////////////////////
  46. //맴버 변수 정의
  47. protected:
  48. std::deque<cTriggerPack*> m_listTriggerPack;
  49. dSTD_STRING m_strStepName;
  50. };


cpp 파일도 가능한 같은 순서와 주석으로 기록합니다. 특정 분류의 함수들이 많아서 길게 늘어진다면 cpp파일을 종류별로 이름을 나누어 기록하는 것이 더 좋습니다.

  1. <ITriggerPackList.cpp>
  2. namespace nsTrigger
  3. {
  4. //////////////////////////////////////////////////////////////////////////
  5. //초기화
  6. void cTriggerPack::destroy()
  7. {
  8. }
  9. void cTriggerPack::resetList(std::deque<cFuncData*> * _list)
  10. {
  11. }
  12. //초기화
  13. //////////////////////////////////////////////////////////////////////////
    .
  14. .
  15. .

  1. <ITriggerPackList_saveload.cpp>
  2. //////////////////////////////////////////////////////////////////////////
  3. //세이브/로드
  4. void cTriggerPack::readList(std::deque<cFuncData*> * _list, FILE * _fp)
  5. {
  6. }
  7. .
  8. .
  9. .
  10. //세이브/로드
  11. //////////////////////////////////////////////////////////////////////////

마침

작성자 : 이 지현 (ljh6341@gmail.com)

'프로그래밍' 카테고리의 다른 글

[펌] Lock-Free Queue  (0) 2012.08.11
Proactor pattern  (0) 2012.08.11
boost::intrusive_ptr  (0) 2012.07.25
Visual Studio 2010 부스트 빌드  (0) 2012.07.24
.cpp 및 헤더 파일에서의 include 다이렉티브  (0) 2012.03.26