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






배너 신청 문의

 
작성일 : 14-10-22 10:48
[QT/Win32] Qt 코딩 스타일 (편집 편)
 글쓴이 : devilqoo
조회 : 9,801   추천 : 0  
   http://kbdyj.tistory.com/entry/Qt-%EC%BD%94%EB%94%A9-%EC%8A%A4%ED%83%8… [1309]
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 220
번호 제   목 글쓴이 날짜 조회 추천
220 자신이 해야 할 일을 결정하는 사람은 세상에… rqyuspv875 10-21 5 0
219 산다는것 그것은 치열한 전투이다. -로망로랑… rqyuspv875 10-21 3 0
218 인간의 삶 전체는 단지 한 순간에 불과하다 . … rqyuspv875 10-21 3 0
217 source 삶이 그대를 속일지라도 슬퍼하거나 노… rqyuspv875 10-21 3 0
216 내일은 내일의 태양이 뜬다 피할수 없으면 즐… wyltqme425 10-20 9 0
215 인생이란 학교에는 불행 이란 훌륭한 스승이 … wyltqme425 10-20 6 0
214 최고에 도달하려면 최저에서 시작하라.-P.시… wyltqme425 10-20 2 0
213 해야 할 것을 하라. 모든 것은 타인의 행복을 … wyltqme425 10-20 3 0
212 평생 살 것처럼 꿈을 꾸어라.그리고 내일 죽… wyltqme425 10-20 10 0
211 이룰수 없는 꿈을 꾸고 이길수 없는 적과 싸… wyltqme425 10-20 7 0
210 만약 우리가 할 수 있는 일을 모두 한다면 우… wyltqme425 10-20 16 0
209 꿈을 계속 간직하고 있으면 반드시 실현할 때… wyltqme425 10-20 7 0
208 사막이 아름다운 것은 어딘가에 샘이 숨겨져 … wyltqme425 10-20 4 0
207 자신의 본성이 어떤것이든 그에 충실하라 . … wyltqme425 10-20 3 0
206 아래에 비교하면 남음이 있다.-명심보감[쇼미… wyltqme425 10-20 7 0
205 nephew 삶이 있는 한 희망은 있다 -키케로유혜… wyltqme425 10-20 7 0
204 고통이 남기고 간 뒤를 보라! 고난이 지나면 … rqyuspv875 10-20 7 0
203 진짜 문제는 사람들의 마음이다.그것은 절대… rqyuspv875 10-20 9 0
202 지금이야 말로 일할때다. 지금이야말로 싸울… rqyuspv875 10-20 6 0
201 도저히 손댈 수가 없는 곤란에 부딪혔다면 과… rqyuspv875 10-20 19 0
200 우선 무엇이 되고자 하는가를 자신에게 말하… rqyuspv875 10-20 9 0
199 longer 자신감 있는 표정을 지으면 자신감이 생… rqyuspv875 10-20 3 0
198 [QT/Win32] MFC에서 Qt 사용하기 팁. (3) devilqoo 09-10 3059 0
197 [QT/X11] QML 모델을 C++ 코드로 구현하는 방법 중 하나 (1) 구름님 12-03 4758 0
196 [QT/X11] QWT for qt android (1) 구름님 03-07 6311 1
195 [QT/Embedded] QTcpSocket사용 시 플러그 뽑힘 증상 체크 방법 요원009 11-13 10251 0
194 [QT/Win32] QML 에서 CustomModule 을 import 하여 사용하기 tmdwn 05-18 5871 0
193 [QT/Embedded] Qt update함수/repaint함수 사용법좀 알려주세여.. (1) 잉농 05-14 5738 0
192 [QT/Embedded] C++ Exception을 활용한 런타임 콜스택 정보 얻기 (1) korone 04-01 6070 0
191 [QT/Embedded] Qt 5.4.1 raspberry Pi 프로그램 개발하기 (5) 구름님 03-31 20192 1
 1  2  3  4  5  6  7  8  


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