코딩 규칙..

zoops의 이미지

말도 많고.. 탈도 많은...
그리고 항상 많이 논의되는....
하지만.... 정답이라고 얘기할수 없는...
코딩 규칙에 대해 또 한번 얘기해 보고 싶습니다...

일딴 얘기할꺼리는 여러가지가 있겠구요..
변수 명명법에서부터
{} 의 위치, 깊이...
함수 명명법..
등등.. 관리, 편리성 측면에서 얘기를 했음 합니다.

현재 고민하고 있는것 중에 하나가..
함수명명법중... 첫글자를 대문자로 할것인지 소문자로 할것인지를 고민하고 있는데..
(쓸데없는것 고민하죠.. ^^)

보통
Data* GetMetaData(); 이런식으로 했었는데...
Java 에서는..
Data* getMetaData(); 이런식으로 첫단어는 소문자로 시작하죠..

그외에
getmetadata() 혹은 get_meta_data() 이런식도 있을테구여..

어떻게 사용하시는지.. 장단에 대해서 얘기해 보고 싶네요..

ps. 가입후 첫글인것 같은데... 잘 쓴건지 모르겠군요.. ^^

서지훈의 이미지

코딩 규칙은...
꼭 어느 규칙을 따라야 할 것까지는 없겠지만...
그래도 꼭 따라주어야 할 규칙들...
변수앞에 _ or __ 같은 민감한 사항들...
또 기타 구현시 다른 것과 충돌이 있을 수 있는 규칙들만 꼭 지켜주고...
나머지는 자신의 스타일되로 하돼...
통일성을 가져야 한다는 걸 얘기를 하고 싶군요...
어떤 소스에선 이런 방법으로...
다른 소스에선 다른 방법으로...
이렇게 하면은 정말 암호문 같은게 되어 버리니...
규칙의 통일이 중요 하겠죠...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

zoops의 이미지

예.. 저도 통일이 제일 중요하다고 생각합니다만..
다른 분들은 어떤 스타일로 하는지....
그리고 그 이유는 무엇인지...
에 대해 얘기 해보고 싶어서요..

- zoops -

hey의 이미지

두 번째 글이십니다. :)

저는 다음과 같이 씁니다.

if, while, for 등의 키워드는 괄호를 한 칸 띄우고 중괄호는 그 줄에

    if (a == 1) {
        cout<< "blah"<< endl;
    } else {
        cout<< "blahblah"<< endl;
    }

함수의 괄호는 붙여서
    const char* ip = my_ip();

클래스 이름은 대문자로
    class TempClass {
    };

메쏘드 이름은 소문자로 시작하고, 멤버 변수는 m을 붙입니다.
    class TempClass {
        int mTemp;
    public:
        int getTemp();
    };

일반 함수는 밑줄과 소문자를 사용
    const char* my_ip();

전역 변수는 g를 붙이고
    bool gBool;

로컬 변수는 소문자로만
    int loop_count;

루프에서 사용할 변수는 옛날식으로 i, j, k 또는 x, y, z처럼 한글자로
    for (int i = 0; i < MAX_LOOP; ++i) {
        cout<< i<< ": blahblah"<< endl;
    }

const 상수는 define 상수처럼 대문자로
    const int MAX_LOOP = 1024;

이렇게 씁니다. :]

탭 크기는 vim 설정을 다음처럼 각 파일의 제일 위에 적습니다.

# vim: set fenc=euc-kr ci sts=4 ts=8 sw=4 et:

이상


----------------------------
May the F/OSS be with you..


송지석의 이미지

저의 경우는 나름대로의 규칙을 정해서 사용중입니다. 하지만 아직 완벽하지도 않고 여러가지 못정한 사항도 있네요.

원래 자바를 할 때 쓰던 규칙을 사용하려고 했으나.. 그러다보니 C에서는 무지 길어지더군요. (자바는 같은 모듈 내에서는 .이전의 내용을 생략할 수 있는데 C는 전부 적어야 하잖아요?)

그래서 이리저리 방황하다가 대략 이렇게 정했습니다.

Global 함수는
대소대소로 한다.
GetMyMessage() 처럼요.
모듈 내부에서 위로 올리는 api는 앞에 모듈명을 써줄 수도 있고요. mp3GetMyMessage() 또는 SPIGetByte().. 앞에 모듈명을 대문자로 할 지 소문자로 할 지는 아직 못정했습니다. 대체로 대문자로 하지만요.

static 함수는
소_소 로 한다.
get_mesg() 처럼요.
이경우 내부적으로 쓸 거니까 이름에 약자를 많이 사용하는 편입니다. 당연하겠지만요.

음 말로 쓰기 귀찮아져서 그냥 제가 만든 규칙 파일을 붙여넣죠..

/******************************************************************************
 *
 * Woori Technology
 * All rights reserved
 *
 *  api- configure related functions
 *
 * file name: coding_convention.c
 * author   : JiSeok Song
 * date     : 2003.8.7
 *
 *****************************************************************************/

/******************Revision History*********************************************
 * 2003.8.7 first version
 *
 ******************************************************************************/
/******************************************************************************
 *                               Includes
 *****************************************************************************/
#include <stdio.h>
#include <string.h>

#include "read_file_test.h"

/******************************************************************************
 *                                Defines
 *****************************************************************************/
////////// internal state
#define CONFIG_NULL         0

///////// etc
#define LINE_MAX    256
#define NULL    0
/******************************************************************************
 *                             Data types
 *****************************************************************************/
typedef struct _myType {
	int all_count;
	int album_count;
	int artist_count;
	int genre_count;
	int playlist_count;
} myType;	// 소대

/*******************************************************************************
 *                           Global Variables
 ******************************************************************************/
int	All_Count = 0;		//대..._대...
/*******************************************************************************
 *                           Static Variables
 ******************************************************************************/
int my_count =0;	//소_소
/*******************************************************************************
 *                           decl Functions(global)
 ******************************************************************************/
int InitConf( void );	//대...대...
/*******************************************************************************
 *                           decl Functions(local)
 ******************************************************************************/
int my_func();//소_소
/*******************************************************************************
 *                                Functions
 ******************************************************************************/

////////////////////////////////////////////////////////////////////////////////
// Test function
int main()
{
	FILE *fpt;
	char string[LINE_MAX];
	fpt = fopen("readline.c", "r");
	while (fgets(string, LINE_MAX, fpt) != NULL) {
		string[strlen(string)-1] = NULL;
		puts(string);
	}
	return 0;
}
////////////////////////////////////////////////////////////////////////////////
// Global functions
int InitConf()
{
	FILE *fh;
	char buffer[LINE_MAX];
	int state= CONFIG_NULL;
	int sub=0;
	int sublist=0;

	fh=fopen(CONF_FILE, "r");
.................

////////////////////////////////////////////////////////////////////////////////
// Local function
int my_function()
{
	return 1;
}

맨 위에는 저작권 정보궁. ^_^
각 섹션별로 /* 주석을 80컬럼에 맞춰 넣어주었습니다.
tabstop을 4로 해놓고 사용하궁 탭으로 indent합니다.
그리고 보시다시피 함수에서는 다음줄에 {를 넣고 if등의 문장에서는 ()옆에 한칸 띄우고 {를 넣습니다.
헤더파일에서는 #ifndef _파일이름대문자_H_
#define _파일이름대문자_H_
....
#endif
로 묶어놓습니다.

논란의 여지는 typedef에서 _을 앞에 쓰는 것과 헤더파일 앞의 defind문일 듯..

저는 아직 정립이 안돼서 계속 바뀔 것 같습니다.
원래 첨엔 global 함수는 자바처럼 소문자대문자 이렇게 했었는데 나중엔 저렇게 바뀌고요.. 음.. 빨리 픽스 시켜야 하는뎅

dondek의 이미지

송지석 wrote:
원래 자바를 할 때 쓰던 규칙을 사용하려고 했으나.. 그러다보니 C에서는 무지 길어지더군요. (자바는 같은 모듈 내에서는 .이전의 내용을 생략할 수 있는데 C는 전부 적어야 하잖아요?)

만약 아래와 같은 구조체가 있다고 할 때에...

typedef struct _object Object;
typedef struct _mankind Mankind;
typedef struct _student Student;
typedef struct _highSchoolStudent HighSchollStudent;

위에서 아래로 상속을 받는다고 하면..

HighSchoolStudent *h = createHighSchoolStudent();

위와 같이 생성했다 할 때에.. object의 멤버중 id를 참조하려면

h->student->mankind->object->id

이렇게 해야겠져. 그래서 길어지는 경향이있지만..
다음과 같이 해결하면 됩니다.

Student *s = h->student;
ManKind *m = s->mankind;
Object *o = m->object;

o->id

원하는 깊이의 구조체 포인터 변수를 만들어서 사용하면 되지 않을까 합니다.

진리를 나의 수준으로 끌어내리지 마라.
나를 진리의 수준으로 끌어올려라. - 배꼽 중에서

Scarecrow의 이미지

Java에서 보통
Class는 대문자로
Method는 소문자로 시작하는 것으로 알고 있습니다.

송지석의 이미지

dondek wrote:

HighSchoolStudent *h = createHighSchoolStudent();

물론 그렇기도 하겠지만 쓰신 바대로 하더라도 함수명의 길이는 길어질 수 밖에 없을 것 같고요,

dondek wrote:

위와 같이 생성했다 할 때에.. object의 멤버중 id를 참조하려면

h->student->mankind->object->id

Student *s = h->student;
ManKind *m = s->mankind;
Object *o = m->object;

o->id
원하는 깊이의 구조체 포인터 변수를 만들어서 사용하면 되지 않을까 합니다.
이 경우에는 너무 줄이려고 치면 가독성이 떨어지지 않을까 합니다.
서지훈의 이미지

다른 문법들은 보통의 kernel 문법을 따르고요...
보통은 헷갈리는게 일반 문법보다도...
variable naming부분이 아닐까 생각을 합니다.
그래서 이것도 문서로 보관하여 통일을할려 노력중입니다.
struct => ds_name
typedef => tf_name
linked-list => list_name
pointer => *p_name
**pp_name

뭐... 이런 식으로...

그리고 함수명도 function_name() 이런식으로...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

pyrasis의 이미지

여러분들은 들여쓰기를 어떻게 사용하시는지

if (i == 0) 
{
vvprintf("Hello");
}

스페이스를 v 로 표시했습니다..

저는 들여쓰기를 2칸으로 하는데

탭문자를 사용하시는분들도 계시고 스페이스 4칸 사용하시는 분들도

계시더군요..

어떤 방식을 사용하시는지[/code]

서지훈의 이미지

전 ts=4 이놈으로 합니다.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

맹고이의 이미지

서지훈 wrote:
전 ts=4 이놈으로 합니다.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

vim에서 ts=4 와 sts=4의 차이가 무엇인가요...?

둘다 다른 값으로 설정하면 sts가 우선하는 것 같은데...

help를 봐도 잘 모르겠네용... :oops:

서지훈의 이미지

맹고이 wrote:
vim에서 ts=4 와 sts=4의 차이가 무엇인가요...?

sts가 뭐죠?
혹시... shiftwidth(sw)?
-_-z
전 sts는 처음 보는거라 잘 모르겠군요...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

탱탱의 이미지

ts = 4 로 해두면
기존의 모든 코드에서 탭싸이즈가 4로 조정되고요
sts =4 해두면 기존의 8싸이즈 코드는 그대로 보여지면서
현재 하는 탭들은 4로 봐집니다;;
경험으로 알고 있는 사실이라
어느것이 더 차이가 있는지는 자세히 모르겠습니다만
저는 sts 셋해서 쓰고있습니다

난 세상의 떨거집니다
더 알 필요가 있겠습니까? 나에 대해서??

yui의 이미지

맹고이 wrote:
서지훈 wrote:
전 ts=4 이놈으로 합니다.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

vim에서 ts=4 와 sts=4의 차이가 무엇인가요...?

둘다 다른 값으로 설정하면 sts가 우선하는 것 같은데...

help를 봐도 잘 모르겠네용... :oops:

ts는 정말 탭의 사이즈를 변경하는 겁니다.
sts는 탭과 "스페이스"를 이용해 탭을 누를 때 그만큼 이동해 준다는 겁니다.

음.. (set ts=4)인 상태와 (set ts=8, sts=4)인 상태에 대해서,서
탭키를 한번 누른 후와 두번 누른 후에 두 상태를 비교해 보시면
차이를 아실 겁니다.

*set ts=4 : 탭한번 -> (4칸짜리 탭하나)
*set ts=4 : 탭두번 -> (4칸짜리 탭두개)

*set ts=8, sts=4 : 탭한번 -> (스페이스 4개)
*set ts=8, sts=4 : 탭두번 -> (8칸짜리 탭하나)

@ 참고로 vim에서 help tabstop하면
Note: Setting 'tabstop' to any other value than 8 can make your file
appear wrong in many places (e.g., when printing it)
와 같은 말이 나옵니다.

pynoos의 이미지

제가 하는 프로젝트에서는 변수나 함수명 붙이는 규칙만 주의하면 됩니다.

괄호 문제나 띄어쓰기등은 모두 indent option을 정해서 cvs에 올라갈 때 자동으로 맞추어 올라 갑니다. CVSROOT/commitinfo 를 사용하지요.

또, CVSROOT/commitinfo에서 mail로 발송하게 하며, 발송되는 메일에는 viewcvs를 통하여 이전 내용과 변경사항을 추적하기 쉽도록 diff URL을 보내게 되어 항상 모니터링합니다.

주석다는 규칙은 doxygen을 따르도록 하고, 한 사람을 두어 지속적으로 모니터링하게 합니다.

zoops의 이미지

pynoos wrote:
제가 하는 프로젝트에서는 변수나 함수명 붙이는 규칙만 주의하면 됩니다.

괄호 문제나 띄어쓰기등은 모두 indent option을 정해서 cvs에 올라갈 때 자동으로 맞추어 올라 갑니다. CVSROOT/commitinfo 를 사용하지요.

또, CVSROOT/commitinfo에서 mail로 발송하게 하며, 발송되는 메일에는 viewcvs를 통하여 이전 내용과 변경사항을 추적하기 쉽도록 diff URL을 보내게 되어 항상 모니터링합니다.

주석다는 규칙은 doxygen을 따르도록 하고, 한 사람을 두어 지속적으로 모니터링하게 합니다.

오~ 예술입니다.
CVS 에 그런기능이 있었군요.. ^^

저도 doxygen 주석을 사용하는데... 프로그램하면서 주석다는것이... 쉽지 않네요.. ^^
나중에 주석다는게 일이 되어버린다는 ^^

변수명명 규칙이랑 함수명명규칙은 어떻게 가지고 계신지요??

- zoops -

pynoos의 이미지

C 와 C++이 조금 다릅니다.

규칙은 몇 페이지나 되지만 대체로,

C++ 코드는 Java style을 따르고, C 는 "_" 로 분리하지요.

어떤 것이든 정해지고 그것을 지키는 것이 중요하다고 봅니다.

그리고, commitinfo 를 이용하여 indent 하는 것은 맞는데

위에제가 잘못 쓴 부분이 있는데요. 알림메일은 loginfo 를 이용하여 메일로 보냅니다. ^^

언제 정리가 되면 CVSROOT에서 loginfo와 commitinfo 를 사용하는 방법을 올려볼까합니다. 한 두군데 버그가 있는데, 귀찮아서 놔뒀더니 공개도 미뤄지고 있네요.

zoops의 이미지

pynoos wrote:
C 와 C++이 조금 다릅니다.

규칙은 몇 페이지나 되지만 대체로,

C++ 코드는 Java style을 따르고, C 는 "_" 로 분리하지요.

어떤 것이든 정해지고 그것을 지키는 것이 중요하다고 봅니다.

그리고, commitinfo 를 이용하여 indent 하는 것은 맞는데

위에제가 잘못 쓴 부분이 있는데요. 알림메일은 loginfo 를 이용하여 메일로 보냅니다. ^^

언제 정리가 되면 CVSROOT에서 loginfo와 commitinfo 를 사용하는 방법을 올려볼까합니다. 한 두군데 버그가 있는데, 귀찮아서 놔뒀더니 공개도 미뤄지고 있네요.

와~
그런데.. 이건 질문인데요..
CVS 도 여러사람이 동시 수정을 막아주는 기능이 있습니까?
예전에 써볼때는 여러사람이 동시에 수정이 되는 바람에.. -.-;;
물론 로그를 남기고 메시지를 보여주긴 하지만..
너무 불편했던 기억이 있는데...

한사람이 해당 파일을 check out 하면 다른 사람이 read 만 되어야 할것 같은데..
CVS 도 되겠져.. 제가 모르는 것일뿐.. ^^

- zoops -

hey의 이미지

zoops wrote:

CVS 도 여러사람이 동시 수정을 막아주는 기능이 있습니까?
예전에 써볼때는 여러사람이 동시에 수정이 되는 바람에.. -.-;;
물론 로그를 남기고 메시지를 보여주긴 하지만..
너무 불편했던 기억이 있는데...

한사람이 해당 파일을 check out 하면 다른 사람이 read 만 되어야 할것 같은데..
CVS 도 되겠져.. 제가 모르는 것일뿐.. ^^

소스를 잠구는 기능도 있지만 보통은 그렇게 사용하지 않습니다.
소스세이프를 생각하시는 모양인데, 그럼 커밋할 때까지는 아무도 사용하지 못하잖아요? 생각하기에 따라서 오히려 그편이 불편할거라고 생각하는데..


----------------------------
May the F/OSS be with you..


monpetit의 이미지

zoops wrote:
CVS 도 여러사람이 동시 수정을 막아주는 기능이 있습니까?
예전에 써볼때는 여러사람이 동시에 수정이 되는 바람에.. -.-;;
물론 로그를 남기고 메시지를 보여주긴 하지만..
너무 불편했던 기억이 있는데...

한사람이 해당 파일을 check out 하면 다른 사람이 read 만 되어야 할것 같은데..
CVS 도 되겠져.. 제가 모르는 것일뿐.. ^^


그런 기능이 없는 게 아니라 일부러 사용하지 않는 겁니다. 동시 수정을 막는 방법이 이른바 Lock-Modify-Unlock 방식이고, CVS 등의 최근 버전관리 시스템에서 사용하는 방식은 동시 수정을 열어 놓는 Copy-Modify-Merge 방식입니다.
동시 수정 후 문제가 생긴 부분을 병합하는 방식보다, 한 사람이 수정할 때 다른 사람으로 하여금 수정을 못 하게 막는 것이 공동작업에 훨씬더 불편함을 준다고 여겨지기 때문입니다.
pynoos의 이미지

다른 분들이 답을 다 해주신것 같군요.

주제와 상관없이 흐르네용..

제가 이 게시판에는 권한이 없으므로 분리를 못시키겠군요.

주제로 돌아가서, 아니 주제를 좀더 확장하여...

코딩 규칙을 검사할 수 있는 툴 같은거 있나요? 있을 거 같으면서도 못찾겠군요.

혹 사용하는 사람이 있으면 알려주시면 좋겠습니다.

대략.. 코딩규칙에 대한 구성화일 하나정도 있는 것이면 좋겠는데..

marzok의 이미지

http://checkstyle.sourceforge.net/

eclipse말고 vim 편집기에서 지원 되는거 같네요.
http://vim.sourceforge.net/scripts/script.php?script_id=448

pynoos의 이미지

Java source에 대한 것이군요...

기능명세를 보니 참 탐나는 기능이 많은 Checker입니다.

report 예로 올라와 있는..

http://maven.apache.org/checkstyle-report.html

이 정도면.. 정말 맘에 듭니다.

C/C++ 용도 있을 법한데... 몇분 뒤져봐서 안나오는군요.