출처 : http://eslife.tistory.com/entry/안전하고-좋은-냄새가-나는-C-코드-만들기

C++
을 배운지 꽤 오래 되었지만, 아직도 코드 리뷰를 통해 다른 개발자들의 코드를 볼 때면 한숨이 나오는 경우가 많습니다.

이런 경우가 반복되다 보니, 예전에 몇 가지 코딩 규칙 비슷하게 만들어놓은 자료가 있어 포스팅해 봅니다.  자료가 만들다 말아 내용이 중구난방이네요..  앞으로도 계속 내용 보강해 나가겠습니다.

 

    포인트 핸들 및 윈도우 핸들 체크

-       함수로 전달된 포인터 인자나, new 로 생성한 포인터 등 모든 포인터는 사용하기 직전 포인터 검사를 수행

-       가급적 STL 컨테이너를 사용해서 아예 포인터를 사용하지 않는 것이 정신건강에 이롭다. (STL 자체적으로 메모리 생성 및 소멸)

-       메모리 LEAK 을 막기 위해 SMART POINT 와 같은 Wrapper 클래스를 만든다.

-       (윈도우 프로그램의 경우)윈도우 API 호출 직전 항상 윈도우 핸들이 정상인지 IsWindow 와 같은 함수로 검사한다.

 

    DRY(Don't Repeat Your Code)원칙

-       같은 코드를 여기 저기 중복해서 사용하지 말아야 한다. (☞ 실용주의 프로그래머 참고). 중복해서 사용할 경우 코드 량이 늘어날 뿐만 아니라 유지보수 cost 가 같이 늘어 나고, 추후 추가/개선/변경 등의 요구사항으로 인한 모듈 수정 시 여러 소스를 함께 수정해야 한다.

-       동일한 코드를 공용 루틴(함수)으로 개발 – 2~3줄 짜리 복잡한 if 문도 bool 를 리턴 하는 함수로 개발(Refactoring 참고)

 

    클래스간 종속성 최소화

-       대규모 프로젝트에서는 공통모듈이 변경되어도 이를 사용하는 모듈이 문제가 없도록 반드시 공통모듈은 인터페이스 기반(데이터가 없는, virtual 가상함수로만 구성된)으로 구현한다. (The C++ Programming Language 참고)

-       A 클래스 → B 클래스 → C 클래스를 사용할 경우 각 클래스는 자기가 직접 다루는 클래스(A B, B C) 만 알아야 한다. A 클래스는 C 클래스를 직/간접적으로 include 해서는 안되며 C 클래스의 변경으로 인해 A 클래스가 컴파일 되어서는 안 된다. A 클래스가 C 를 직접 접근할 경우가 있다면 B 클래스에 위임함수를 만들어 해결한다. (☞ 실용주의 프로그래머 참고)

-       B 클래스가 A 클래스로 어떤 데이터를 전달할 경우가 있다면(주로 이벤트 발생시 값을 전달하기 위해) A 클래스의 최소 인터페이스만을 B 클래스에 전달하여(COM 의 이벤트 소스 방식) 종속성을 최소화 한다. (Developer’s Workshop To COM and  ATL 3.0 참고)

 

    함수 인자 전달

-       함수의 인자는 최대 7개를 넘지 않아야 한다(Code Complete 2 참고)

-       클래스 인스턴스를 함수 인자로 넘겨서는 안 된다(특히 함수 인자로 CString 을 넘기는 경우가 많음. CString → const CString& CString*, const char* 등으로 수정한다. )

 

    오류조건을 먼저 검사하여 오류 체크로 인해 코드 가독성이 떨어지지 않도록 하자.

-       특정 오류조건이 발생하면 더 이상 함수 수행에 의미 없을 경우, 이러한 오류 조건들은 함수초입단계부터 먼저 확인해서 바로 리턴 한다

-       위와 같이 오류조건이 먼저 확인되면 프로그램 코드에서 if depth 가 줄어 들고 코드 읽기가 수월해 지는 장점이 있다.

Before

After

void CClass::OnTest()

{

 ...

 ...

 if (m_pWndMain)

 { 

  DoSomething1();

 }

 ...

 if (m_pWndMain)

 { 

  DoSomething2();

 }

 

}

void CClass::OnTest()

{

 if (m_pWndMain == NULL)

  return;

 ...

 ...

 DoSomething1();

 ...

 DoSomething2();

 

}

 

    긴 함수 쪼개기 (Refactoring 참고)

-       긴 함수는 작은 여러 개의 함수로 쪼갠다(Refactoring 책에 의하면 2-3줄 짜리 함수로까지 쪼개어서 코드 가독성을 높이도록 하고 있음)

-       작은 함수로 쪼개다 보면, 작은 함수를 재활용하게 될 수 있고

-       긴 함수보다 코드 읽기가 수월해 지며

-       결국 유지보수가 쉬워진다

 

    enum 값 선언 시 _START, _END 를 활용하자( CODE COMPLETE2 참고)

-       enum 으로 선언된 값들을 변수나 for loop 를 이용하여 반복 계산할 경우가 종종 있는데 이 경우 enum 시작과, 끝을 나타내는 값을 enum 선언에 포함하면 유용하게 사용할 수 있다.

-       추후 enum 에 값을 추가해야 할 경우 _END 값을 사용한 배열은 코드 변경없이 크기가 늘어남

-       For 루프 등에 _START, _END 을 사용할 수 있어 유지 보수에 유리

Before

After

enum WEEK_NAME

{

           SUNDAY                     = 0,

           MONDAY                    = 1,

           TUESDAY                    = 2,

           WEDNESDAY     = 3,

           THURSDAY       = 4,

           FRIDAY            = 5,

           SATERDAY        = 6,

};

 

int nWeeks[SATERDAY + 1];

}

enum WEEK_NAME

{

           WEEK_STAR       = 0,

           SUNDAY                     = 0,

           MONDAY                    = 1,

           TUESDAY                    = 2,

           WEDNESDAY     = 3,

           THURSDAY       = 4,

           FRIDAY            = 5,

           SATERDAY        = 6,

           WEEK_END        = 6,

};

 

int nWeeks[WEEK_END + 1];

 

 

    복잡한 제어문을 가진 루틴을 피하자  

-       If 문은 2 depth 이상 들어 갈 경우 refactoring 하라 (CODE COMPLETE2)

     대부분 코드를 제대로 이해하지 못해 복잡한 코드를 작성하고 있다.

     개발자 90% 2 depth 이상 들어가는 if 문장을 이해하지 못한다

-       IF~ELSE IF ~ELSE IF ~ …. ELSE 가 길게 이어질 경우 SWITCH 문으로 바꾼다

-       IF 문이 길게 늘어 질 경우 함수로 분리한다

-       C++ factory 개념으로 상속을 이용한 클래스를 만드는 방법도 활용

신고
Posted by 나비 나비:D
태그 c++

▩ C, C++언어의 이해


1. 교육 효과와 방향
   - 메모리에 대한 이해
   - 함수에 대한 이해
   - 포인터에 대한 이해
   - 제어문에 대한 이해




2. 프로그래밍 언어 별 특징
   - C
     . 함수 기반 언어, 배우기 쉽고 구현이 쉽습니다.
     . 프로그램이 커지면 설계가 어렵고 유지보수가 어려워 요즘은 C++ 로 전향되는 경우도 많이

       있습니다.

   - C++
     . C의 특징을 전부 가지고 있습니다. 객체지향의 기술을 구현 할 수 있습니다.
     . 모듈을 객체의 형태로 구현함으로 정확한 설계만 된다면 견고하고 유지보수가 좋은 프로그램

       개발할 수 있습니다.
     . 모든 개발자가 객체지향에 대한 개념이 있어야 개발이 가능합니다.

   - VC++
     . C, C++, Windows 개념

   - VB, Powerbuilder
     . DB 프로그램 제작




3. C 언어의 역사
   - ALG --> CPL --> BCPL --> B --> C --> C++ --> Visual C++ --> C#, Visual C++.net
   - C언어는 1972년 미국의 AT&T Bell 연구소에 근무하는 Dennis Ritchie와 Ken Thompson이 마

     로 컴퓨터 수준의 새로운
     운영체제인 Unix를 개발하던 과정에서 프로그래밍 개발을 위한 도구의 필요성을 느껴 처음 만

     졌다.




4. C 언어의 특징
   - C언어는 중급 기능의 언어이다. Assembler -- C -- Visual Basic
   - C언어는 구조화된 언어이다. 함수의 이용
   - C언어는 Assembly언어에 비하여 문법이 유연하고, 다른 운영체제에 이식하기 쉬우며, 개발 속

     훨씬 빠르다.
   - C언어는 절차 지향언어이다. 따라서 실행 순서가 매우 중요하다.
   - 대소문자를 구별한다.
   - 코드양을 줄이기 위한 다양한 방법이 있다.
   - 증가, 대입, 조건, 비트, 감소, 컴마, 포인터등 연산자가 풍부하다.
   - 포인터의 이용으로 메모리를 세밀하게 프로그래밍 할 수 있다.
   - char, int, float, double, signed, unsigned, long, short, 구조체, 공용체, const, register, 형등

      이터형 다양   
   - 최소한 1개 이상의 함수로 구성된다. (main())
   - if, for, while, do, switch, break, continue등 구조화 제어문이 갖추어져있다.
   - 컴파일에 앞서 텍스트레벨의 프리프로세서를 지원한다.
   - C자체 입출력 기능은 없음으로 외부함수로 지원한다.
   - TAB과 같은 확장 문자열의 표현이 가능하다.
   - 함수의 프로토타입을 선언하여 프로그램 작성을 효율적으로 하게 해준다.




5. C++언어의 특징
   - C언어의 특징에 OOP(객체지향)개념을 도입한 언어
   - 클래스란 개념이 도입되었으며 C언어의 구조체의 발전형이다. 구조체처럼 데이터만 가지고 있

      것이 아니라 메소드도 포함하고 있는 단 C++의 변종 구조체는 메소드도 포함한다.
   - 객체라는 개념이 추가되었으며 클래스의 복제판으로 메모리에 저장된다.
   - 연산자 중복기능, 함수 중복 기능, 상속 기능을 가지고 있다.
  


6. 컴파일 과정

      Compiler                Linker -- Library
               ↓                       ↓
   cpp ------------> obj ------------> EXE
   소스파일               기계어 파일          실행파일

신고
Posted by 나비 나비:D

BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
----------------------------- (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

글 보관함

달력

«   2017/08   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
Total : 870,694
Today : 153 Yesterday : 169