커뮤니티 | 큐티/임베디드/큐토피아 | PODO | SDL | 마이크로윈도우 | 리눅스프로그래밍 | 기타 | 포인트순위 | 최근게시물최근게시물 RSS  
korone.net에 다루었으면 하는것은요?
 
 
 
 
 
540
1,131
3,878
4,016,085
  현재접속자 : 87 (회원 0)






배너 신청 문의

 
작성일 : 14-10-22 10:48
[QT/Win32] Qt 코딩 스타일 (편집 편)
 글쓴이 : devilqoo
조회 : 10,102   추천 : 0  
   http://kbdyj.tistory.com/entry/Qt-%EC%BD%94%EB%94%A9-%EC%8A%A4%ED%83%8… [1348]
Qt는 오픈소스로 개발이 되서 전세계 수십만(?)의 개발자가 사용하는 프레임워크이기 때문에 강력한 코딩 스타일 규칙이 존재 합니다.

크게 두가지 가이드라인 문서가 존재하는 데

(1) 편집기 측면에서의 코딩 스타일
(2) C++ 측면에서의 코딩 규칙들(언어 측면)

오늘은 먼저 쉬운 편집 측면에서의 코딩 스타일을 올립니다.
티스토리에 있는걸 옮겨 놓았기 때문에 약간은 읽기 불편할 수 있습니다. ^^
참고로 제 티스토리는 늘 반말체입니다.

/*!
 *
 * 여기서 부터 내용 시작
*/

보통 팀 단위의 프로젝트를 진행하게 되면 대개의 경우 코딩 컨벤션을 정해 놓고 개발을 하는 경우가 많다.
A4 한장에서부터 몇장 분량 더 크게 나가면 구글의 C++ 코딩 컨벤션 처럼 방대한 분량의 규칙을 정하기 까지 한다.

Qt 도 오랜 시간의 개발 기간을 거쳐 수많은 개발자들의 갑론을박을 거쳐 지금의 형태로 완성 되었을 것이다.

별거 아닌 규칙처럼 보여도 매우 합리적인 근거에 기반을 두고 만들어진 규칙인 만큼 Qt를 사랑하는 사람들이라면 도입을 한번 생각해보자.




--- 들여쓰기

들여쓰기는 4칸의 공백(space)을 둔다.
탭이 아닌 공백이다. (에디터에 탭을 공백으로 바꾸는 옵션이 있다면 켜 놓도록 하자)




--- 변수 선언

변수는 한 라인에 한개 씩 선언한다.
짧거나 의미 없는 이름은 피하자. (예 : "a", "rbarr", "nughdeget")
한글자 변수명은 카운터나 임시변수에서 목적이 분명할 때 사용 할 수 있다.
변수 선언은 미리 선언하지 않고 필요한 곳에서 선언 한다.

[잘못된 예]
int a, b;
char *c, *d;

[올바른 예]
int width;
int height;
char *nameOfThis;
char *nameOfThat;

변수명과 함수명은 소문자로 시작한다. 연속 단어의 경우 첫 글자는 대문자로 한다.
약어는 사용하지 않는다.

[잘못된 예]
short Cntr;
char ITEM_DELIM = '\t';

[올바른 예]
short counter;
char itemDelimiter = '\t';

클래스는 대문자로 시작한다. 공용 클래스(Public classes)의 경우 대문자 'Q'로 시작하며 공용 함수는 소문자 'q'로 시작한다.
Qt 소스를 작성하는 개발자만 해당. :)
class QRgb;
qRgb()


약어의 경우 전부 대문자로 사용하는 것이 아니라 camel-case 규칙에 따라 첫 글자만 대문자를 사용한다.
잘못된 예 : QXMLStreamReader
올바른 예 : QXmlStreamReader




--- 공백 (Whitespace)

Statements 그룹 사이에는 빈 줄 하나를 넣는다.
항상 한 줄의 빈 줄을 사용한다. (두줄 이상 금지)
키워드와 중괄호 사이에는 공백 하나를 둔다.

[잘못된 예]
if(foo){
}

[올바른 예]
if (foo) {
}

포인터와 참조는 타입과 '*' 또는 '&' 사이에 공백을 하나 둔다. 다만 '*' 또는 '&'과 변수 사이에는 공백없이 붙여 쓴다.
char *x;
const QString &str;
const char * const y = "hello";

단항 연산자는 앞뒤에 공백을 둔다.
   a = b + c;

형변환 연산자 뒤에는 공백이 없다.
가능하다면 C스타일의 형변환은 피한다.

[잘못된 예]
char* blockOfMemory = (char*) malloc(data.size());

[올바른 예]
char *blockOfMemory = reinterpret_cast<char *>(malloc(data.size()));

한 줄에 여러 statements를 두지 말자
제어문의 Body는 새로운 줄로 시작한다.
[잘못된 예]
if (foo) bar();

[올바른 예]
if (foo)
    bar();




--- 중괄호(Braces)

if ~ else 와 같이 중괄호가 연결되어 사용 되는 경우 아래와 같은 규칙으로 사용한다.
[잘못된 예]
if (codec)
{
}
else
{
}

[올바른 예]
if (codec) {
} else {
}

예외 : 함수나 클래스 선언의 경우 중괄호를 라인의 처음에서 시작한다.
static void foo(int g)
{
    qDebug() << "foo : %i", g);
}

class Moo
{
};

명령문이 두줄 이상일 때에만 중괄호를 사용하자
[잘못된 예]
if (address.isEmpty()) {
   return false;
}

for (int i=0; i<10; ++i) {
    qDebug("%i", i);
}

[올바른 예]
if (address.isEmpty())
    return false;

for (int i=0; i<10; ++i)
   qDebug("%i", i);

예외 : 조건문이 여러줄에 걸쳐 있을 경우 명령문이 한줄이어도 중괄호 사용 가능
if (address.isEmpty()) || !isValid()
   || !coded) {
   return false;
}

예외 : if ~ else 문중 한쪽만 명령어가 여러개 인 경우 if, else절 모두 중괄호를 사용한다.
[잘못된 예]
if (address.isEmpty())
    return false;
else {
    qDebug("%s", qPrintable(address));
    ++iter;
}

[올바른 예]
if (address.isEmpty()) {
    return false;
} else {
    qDebug("%s", qPrintable(address));
    ++iter;
}

[잘못된 예]
if (a)
if (b)
...
else
...

[올바른 예]
if (a) {
    if (b)
    ...
    else
    ...
}

명령어 줄이 비었을 때 중괄호 사용
[잘못된 예]
    while (a);

[올바른 예]
    while (a) {}




--- 괄호

표현식을 그룹화 할 때 괄호를 사용한다.
[잘못된 예]
if (a && b || c)

a + b & c

[올바른 예]
if ((a && b) || c)

(a + b) & c




--- Switch 문

case 라벨은 switch 와 같은 열에 위치한다.
case 의 끝에는 break 문(또는 return)이 있어야 하며 그렇지 않을 경우(break가 없는) case 문이 바로 나오지 않는 다면 주석을 달아 break가 없음을 알린다.

switch (myEnum) {
case Value1:
    doSomething();
    break;
case Value2:
case Value3:
    doSomethingElse();
    // fall through
default:
    defaultHandling();
    break;
}




--- Jump 문(break, continue, return, 그리고 goto)

jump 문 뒤에는 'else'를 사용하지 않음
[잘못된 예]
if (thisOrThat)
    return;
else
    somethingElse();

[올바른 예]
if (thisOrThat)
    return;
somethingElse();

예외 : 코드가 대칭적으로 되어 있는 경우 가독성을 위해 else를 사용할 수 있다.




--- Line Break

한 줄에 100칸 이상 사용하지 말자.
단항 연산자가 여러 줄에 걸쳐 있을 경우 맨 앞에 사용 하자. 일부 창 크기가 작은 에디터에서 가려져 실수로 빠뜨릴 수가 있다.

[잘못된 예]
if (longExpression +
    otherLongExpresstion +
    otherOtherLongExpression {
}

[올바른 예]
if (longExpression
    + otherLongExpresstion
    + otherOtherLongExpression {
}
Qt !!!



인라이… 14-10-22 13:54
 
잘못된 예 라고 표현하기는 좀 그런것 같습니다.
코딩 컨밴션은 조직 문화마다 다른데 옳고 그름을 나누기 보다는 Qt 전체적인 코딩 스타일이 이렇다라고 알려주는 정도로 쓰는게 나을듯 해 보입니다.
실제 Qt Creator 에서도 옵션에서 Code Style 에서 다양한 코딩 컨밴션을 적용할수 있도록 하고 있습니다.
항상 좋은글들은 감사히 보고 있습니다 ;)
     
devilqoo 14-10-22 14:08
 
Qt 문서에 "Wrong" 이라고 쓰여있는걸 번역해 옮기 다보니 잘못된 예라고 하였네요.

아마도 문서 자체가 Qt 오픈소스에 기여를 하려는 사람들에게 Qt 개발 가이드라인을 강제하려는 목적이다 보니 그런 용어를 사용했으리라 생각 됩니다.

실은 번역을 마치고 저도 오늘부터 이 가이드라인에 따라 습관을 고치고 있습니다. 사내에 아직 코딩 가이드라인이 없다보니. ㅎㅎ
devilqoo 14-10-22 14:36
 
아래는 참고 자료로 구글의 C++개발자를 위한 스타일 가이드 라인입니다.
예전에 영문판을 보려다 1/3보고 포기했는 데 어느 훌륭하신 분들이 한글화를 완료하였습니다.

가이드라인의 장단점을 들며 설명을 잘 해 놓았네요.
그리고 읽다 보면 왠지 C++ 속성 스터디 하는 느낌도 듭니다. :)

http://likelink.co.kr/29552
구름님 14-10-23 09:06
 
고등학교때 담임선생님이 전산과목을 가르치셨습니다. 그분께서 하신말이 기억나네요.
'프로그램 코딩은 내가 보기보단 남이 보기에 편하고 좋게 작성하라'
한국 말이라는것은 알아도 그땐 잘 이해가 안갔는데, 겪어보니 알겠더군요.
같은 내용이라 생각됩니다. 물론 코딩 스타일에 나만의 개성이 생겨나기 마련이지만서도.
 
 

Total 198
번호 제   목 글쓴이 날짜 조회 추천
198 [QT/Win32] MFC에서 Qt 사용하기 팁. (3) devilqoo 09-10 3406 0
197 [QT/X11] QML 모델을 C++ 코드로 구현하는 방법 중 하나 (1) 구름님 12-03 5063 0
196 [QT/X11] QWT for qt android (1) 구름님 03-07 6536 1
195 [QT/Embedded] QTcpSocket사용 시 플러그 뽑힘 증상 체크 방법 요원009 11-13 10660 0
194 [QT/Win32] QML 에서 CustomModule 을 import 하여 사용하기 tmdwn 05-18 6143 0
193 [QT/Embedded] Qt update함수/repaint함수 사용법좀 알려주세여.. (1) 잉농 05-14 5919 0
192 [QT/Embedded] C++ Exception을 활용한 런타임 콜스택 정보 얻기 (1) korone 04-01 6258 0
191 [QT/Embedded] Qt 5.4.1 raspberry Pi 프로그램 개발하기 (5) 구름님 03-31 20902 1
190 [QT/Win32] Qt 다국어 처리 (2) korone 03-17 12557 0
189 [QT/Win32] signal to signal devilqoo 02-13 5572 0
188 [QT/Win32] Qt x64 바이너리 제공 사이트 (1) 인라이… 02-12 5516 1
187 [QT/Embedded] 우분투 Qt5 크로스 컴파일 (14/11/26 2차 수정) (9) 김아무… 11-12 15514 0
186 [QT/Embedded] Qt 5.3.2에서 Mouse Double Click시 이벤트 문제 (2) korone 11-11 5569 0
185 [QT/Embedded] QtWinExtras korone 11-11 5611 0
184 [QT/Win32] Qt 코딩 스타일 (편집 편) (4) devilqoo 10-22 10103 0
183 [QT/Win32] Qt와 C++11 (2) devilqoo 10-12 10459 1
182 [QT/Win32] Qt 에서의 이벤트 처리 (5) devilqoo 10-09 9988 0
181 [QT/Win32] QList와 QVector의 비교. (2) devilqoo 10-02 7227 0
180 [QT/Win32] Qt에서 사용되는 컨테이너들을 정리해 보았습… (4) devilqoo 10-01 8188 0
179 [QT/X11] qmake DEFINES 변수에 공백문자가 포함된 값을 설… (1) 별님 09-25 5195 0
178 [QT/Win32] 데이터 압축 관련 qCompress(), qUncompress() (9) 구름님 09-16 5804 0
177 [QT/Win32] QML 로 One-Source Multi-Platform (iOS, Android) 실행 tmdwn 09-03 7260 0
176 [QT/Win32] QML 로 iOS Application 제작하기 tmdwn 09-02 7216 0
175 [QT/Win32] QML 로 Android Application 제작하기 (4) tmdwn 09-02 7672 2
174 [QT/X11] qt에서 메모리 조작하기. (2) 나무나… 07-25 8045 0
173 [QT/Win32] Q_DECLARE_FLAGS 매크로 (2) 구름님 07-11 6500 2
172 [QT/Win32] Q_PROPERTY 매크로 (6) 구름님 07-09 8932 2
171 [QT/Win32] Q_INTERFACE 매크로에 대해.. (4) 구름님 07-08 6307 2
170 [QT/Win32] windeployqt.exe라는 프로그램이 있습니다. (4) 구름님 07-07 12580 1
169 [QT/X11] Qt App을 Mac Appstore에 올리기 (3) korone 07-02 7913 0
 1  2  3  4  5  6  7  


About korone.net | Copyright 2003 korone.net. All rights reserved.