독고솜의 인생일지
C++ CODE "Fun하고 Cool하고 Sexy한 코딩 Style 본문
왜 코딩 스타일에 많은 시간을 투자해야할까? 아니, 그 가치는 있을까?
인턴에게 지저분한 웹 애플리케이션 넘겨줬을때 퇴사하는 이유, 그리고 기본 로직을 과연 1년이 지나도 기억할 수 있을까?
- 문서화
- 분활
- 명명 규칙
- 언어 사용
- 포매팅
https://tasddc.tistory.com/34?category=1003492
https://tasddc.tistory.com/34?category=1003492
코드 문서화
소스 파일에 작성된 주석을 의미.
코들르 작성항 당시 가졌던 생각을 다른 이에게 전할 수 있는 좋은 기회.
주석의 중요성은 상당히 높음.
1. 클라이언트에 코드를 사용하는 방법을 알려주기 위해서. 헤더 파일에 정의된 public 함수나 메서드 만큼은 반드시 주석을 달도록.
/*리턴값 : int
저장된 값을 int로 반환해줌.
발생 가능한 익셉션 :
어찌고 하면 발생.
2.코드의 알고리즘 설명 주석.
알고맂므 위에 다 넣고
중간중간 씩 넣기.
3. 메타정보
//TODO: 앞으로 할일.
및 공지같은거.
int a; // 버그 #123를 해결하도록 추가한 문장 - Kim
4. 주석 스타일
if(input & 2 == 0 ) // 결과가 짝수면...
5. 임의 주석
소스 파일에 작성된 주석을 의미.
코들르 작성항 당시 가졌던 생각을 다른 이에게 전할 수 있는 좋은 기회.
정해진 형식과 관계없이 필요할 때마다 주석을 달 때가 있다. 아래와 같은 가이드라인을 따라야 한다.
- 공격적이거나 무시하는 표현은 삼간다. 다른 사람이 언제든지 볼 수 있기 때문.
- 팀원끼리만 이해하는 농담을 적어도 문제 되진 않지만, 관리자의 검토를 받는 것이 좋다.
- 주석을 작성하기 전에 굳이 주석을 달 필요가 없도록 코드를 수정할 수 없는지 검토.
- 누군가 여러분이 작성한 코드를 읽고 있다고 생각하고 쉽게 이해할 수 없는 부분마다 주석을 남긴다.
- API를 사용하는 과정이 명확하지 않다면 사용한 API에 대한 참고 문헌을 남긴다.
- 코드를 업데이트하면 주석도 반드시 업데이트해준다.
- 한 함수를 여러 부분으로 나누기 위해 주석을 작성할 때, 그 함수를 더 작은 단위의 함수로 나눌 수 없는지 검토한다.
분활
코드 분활이란 코드를 더 작은단위로 나눠서 작성한느 방식.
- 리팩터링이란? 코드의 구조를 재조정하는 작업이라고 한다. 리팩터링의 기법은 간단하게 다음과 같다.
- 추상화 수준을 높이는 기법
- 필드 캡슐화 : 필드를 private로 설정, getter & setter로 접근
- 타입 일반화 : 코드를 좀 더 공유할 수 있도록 일반적인 타입 사용
- 코드를 좀 더 논리적으로 분할하는 기법
- 메서드 추출 : 거대한 메서드를 좀 더 이해하기 쉽도록 일부를 발췌하여 새로운 메서드로 정의
- 클래스 추출 : 기존 클래스에 있는 코드 중 일부를 새 클래스로 옮긴다.
- 명칭과 위치를 개선하는 기법
- 메서드 및 필드 이동 : 좀 더 적합한 클래스나 소스 파일로 이동한다.
- 메서드 및 필드 이름 변경 : 목적이 잘 드러나도록 이름을 바꾼다.
- 올리기 : OOP에서 기본 클래스로 옮기는 기법
- 내리기 : OOP에서 상속 클래스로 옮기는 기법
- 추상화 수준을 높이는 기법
- 리펙토링은 코드 분할을 수행할 좋은 기회이다.
- 리펙토링 하는 과정에서 버그가 발생하는 부분을 찾을 수 있도록 테스팅 프레임워크(단위 테스트 등)를 사용하는 것이 좋다.
3.4 명명 규칙
C++ 컴파일러의 명명 규칙
이름의 첫 글자로 숫자 X (int i = 1to2);
더블 언더스코어는 특정한 용도로 사용되기 떄문에 금지. (my____name)
언더스코어로 시작하는 이름도 안됨.(_name, _thjwu)
상수는 k
전역은 g
클래스 멤버는 m
부울은 b
카운터는 m_num
int i > int row 이렇게 바꿔라.
#include <iostream>
#include <string>
#include <charconv>
#include <string_view>
using namespace std;
int main(void) {
for (int row = 1; i < 10; i++) {
for (int column = 1; j < 10; j++) {
}
}
}
_ 와 대문자 A 구별
함수나 메서드 이름을 대문자,
스타일
포인터 대신 레퍼런스 사용하기
익셉션
그거.
포매팅
코드 서식에 대한 논쟁으로 싸우는 일이 다반사.
if문에서 공백을 넣는 위치에 대한 논쟁.
특히 if{
}
if
{
}
에 대한 논쟁은 많고 어떤 스타일이 좋은지에 대한 의견은 없다.