본문 바로가기

언어/C++

[C++ 개념] 3. 코딩 스타일

Clean Code

 

1. 보기 좋은 코드의 중요성

  • 한 문제의 알고리즘을 풀기위한 코드는 30분 정도가 걸릴 것.
  • BUT, 코드를 기능적으로 분할, 적절한 주석, 깔끔한 구조를 만드는데는 많은 시간이 소요
  • WHY? 자신이 짠 코드를 다른 사람이 다시 이용해야할 경우, 어떤 상황이 펼쳐질지 생각하면 이해가 쉬움
  • 좋은 코드의 일반적인 구성 요소
    • 문서
    • 분할
    • NAMING
    • 언어의 사용 형태
    • FORMATING

 

2. 코드의 문서화

주석을 일반적으로 의미

작성해야 하는 이유

  1. 사용법을 설명하기 위해 - 함수, 메서드에 주석을 달아 해당 기능, 사용 방법을 설명할 수 있음
  2. 복잡한 코드를 설명하기 위해
  3. 메타정보를 제공하기 위해 - 코드가 생서된 배경 등을 설명할 수 있음

 

3. 코드 분할

큰 덩어리의 코드를 작은 덩어리로 쪼개는 것

리팩토링을 통한 코드 분할

  • 추상화를 강화
    • 필드(멤버 변수)를 캡슐화 - Private 블록에 필드를 두고 GETTER와 SETTER를 이용
    • Type을 일반화
  • 논리적인 부분으로 분할
    • 메서드 추출
    • 클래스 추출
  • 네이밍과 코드 위치 개선
    • 메서드 / 필드를 이동 및 이름 변경 - 적합한 위치, 적절한 이름으로 변경
    • 풀업 / 풀다운 - OOP 코드에서 상위, 하위 클래스로 이동

 

4. 네이밍(Naming)

좋은 이름을 선택하기 위해 가장 좋은 방법은 작성자가 아닌 다른 프로그래머에게 보였을 때 의도대로 이해하는지 시험

예시

  • gSetting - 전역변수(global)임을 알 수 있음
  • mNameCounter - 클래스 멤버 변수임을 알 수 있음
  • calculateDistance() - 단순하고 명확
  • m_pHandler - 클래스 멤버 변수이면서 포인터임을 알 수 있음

 

네임스페이스를 적절히 사용하여 다른 모듈의 같은 이름과 혼용해서 사용하지 않도록 해야함

  • Book::readFile - Book 이란 클래스 안에 readFile을 의미
  • Excel::readFile - Excel 파일을 읽는 것을 의미

헝가리언 표기법(Hungarian Notation)도 많이 사용 - 접두사를 만들 때 많은 의미를 담음

  • char *pszName; // psz는 null로 끝나는 문자열을 의미 (Pointer, String, Zero-terminated)

 

5. 스타일이 있는 언어의 활용

무의미한 네이밍(a, i, j, k 등)을 피해야 함

상수 값을 남용하면 이해하기 힘든 코드가 만들어짐.

  • 자신이 정해놓은 값(원주율) 3.14159를 필요할 때마다 적는다면, 다른 프로그래머(수학적 지식이 없는)가 보았을 때, 해당 값이 무엇인지 왜 사용하는지 알기 어려움
  • Therefore, "#define PI 3.14159" 등의 방법을 사용해야 함

 

6. 포매팅(Formating)

조직 내에서 지정한 포맷(규칙, 룰)을 따라 코딩하는 것이 중요함

예시

  • if 문 뒤에 공백을 두고 조건을 작성하라
  • 함수를 정의할 때, 중괄호('{')는 다음칸에 삽입하라
  • 포인터를 선언할 때, 변수 앞에 '*'를 붙여라

'언어 > C++' 카테고리의 다른 글

[C++ 개념] 2. 문자열의 활용  (0) 2021.09.17
[C++ 개념] 1. STL 부딪혀보기  (0) 2021.08.15