Coding Style에 대해서 조언을 듣고자 합니다..

jmjarre의 이미지

안녕하세요.
제가 코딩을 하면서 몇가지 의문이 생겨 여러분께 조언을 듣고자 합니다.
맘에 드는 코딩 스타일이 어떤것이지 그리고 잘못된 부분이 있다면 꼭 집어 주시면 감사하겠습니다...

아래 함수들을 input, output이라는 입력 인자를 받아서 그에 맞게 하드웨어 세팅을 해주는 함수들입니다.
input 값에 따라 output 인자가 한정되어 지며 그에 따라 FALSE, TRUE 를 반환해 줍니다.

잘 부탁드리겠습니다.. 꾸벅..... :)

mixer 함수 mixer_varify 함수 두분으로 나뉘어져 있습니다.

/**** mixer ****/

/* style 1과  style 2 의 경우 varify 함수는 빠진 상태 */
/* style 1 */
bool mixer(int input, int output)
{
	bool return_val;

	if ( mixer_input(input) == TRUE ) 
	{
		if ( mixer_output(output) == TRUE )
				return_val = TRUE;
	}
	else
	{
		return_val = FALSE;
	}

	return return_val;
}




/* style 2 */
bool mixer(int input, int output)
{
	if ( mixer_input(input) == TRUE ) 
		if ( mixer_output(output) == TRUE )
			return TRUE;

	return FALSE;
}



/*------------------------------------------------------------*/




/* style 3 */
/* varify 하는 함수를 내장 시킨 경우 */
bool mixer(int input, int output)
{
	if (input == LD2LO || input == RD2LO)
	{
		if (input == LI2LO || input == RI2LO)
		{
			if (mixer_input(input) == TRUE)
				if (mixer_input(output) == TRUE)
					return TRUE;
		}
	}
	else if (input == LD2MO || input == RD2MO)
	{
		if (input == LI2MO || input == RI2MO)
		{
			if (mixer_input(input) == TRUE)
				if (mixer_input(output) == TRUE)
					return TRUE;
		}
	}
	else if (input == LD2RO || input == RD2RO)
	{
		if (input == LI2RO || input == RI2RO)
		{
			if (mixer_input(input) == TRUE)
				if (mixer_input(output) == TRUE)
					return TRUE;
		}
	}

	return FALSE;
}



/* style 4 */
/* varify 함수를 따로 두어 사용한 경우 */
/*   i) if 문을 단계적으로 사용, TRUE 를 우선으로 검사 */
bool mixer(int input, int output)
{
	if ( mixer_varity(input, output) == TRUE )
		if ( mixer_input(input) == TRUE ) 
			if ( mixer_output(output) == TRUE )
				return TRUE;

	return FALSE;
}



/* style 5 */
/*   ii) if 문을 순차적(?)으로 사용, FALSE 를 우선으로 검사 */
bool mixer(int input, int output)
{
	if ( mixer_varity(input, output) == FALSE )
		return FALSE;

	if ( mixer_input(input) == FALSE )
		return FALSE;

	if ( mixer_output(output) == FALSE )
		return FALSE;

	return TRUE;
}



/*------------------------------------------------------------*/


/***** mixer_varify *****/

/* style 1 */
bool mixer_varify(int input, int output)
{
	bool return_val;

	switch (input)
	{
		case LD2LO:
		case RD2LO:
			switch (output)
			{
				case LI2LO:
				case RI2LO:
					return_val = TRUE;
					break;

				default:
					return_val = FALSE;
					break;
			}
			break;
		
		case LD2MO:
		case RD2MO:
			switch (output)
			{
				case LI2MO:
				case RI2MO:
					return_val = TRUE;
					break;

				default:
					return_val = FALSE;
					break;			
			}
			break;

		case LD2RO:
		case RD2RO:
			switch (output)
			{
				case LI2RO:
				case RI2RO:
					return_val = TRUE;
					break;

				default:
					return_val = FALSE;
					break;			
			}
			break;

		default:
			return_val = FALSE;
			break;
	}

	return return_val;
}




/* style 2 */
bool mixer_varify(int input, int output)
{
	if (input == LD2LO || input == RD2LO)
	{
		if (input == LI2LO || input == RI2LO)
			return TRUE;
	}
	else if (input == LD2MO || input == RD2MO)
	{
		if (input == LI2MO || input == RI2MO)
			return TRUE;
	}
	else if (input == LD2RO || input == RD2RO)
	{
		if (input == LI2RO || input == RI2RO)
			return TRUE;
	}

	return FALSE;
}


/*------------------------------------------------------------*/



bool mixer_input(int input)
{
	// DO SOMETHING

	return TRUE;
}

bool mixer_output(int output)
{
	// DO SOMETHING

	return TRUE;
}
Fe.head의 이미지

jmjarre wrote:

/**** mixer ****/

/* style 1과  style 2 의 경우 varify 함수는 빠진 상태 */
/* style 1 */
bool mixer(int input, int output)
{
	bool return_val;

	if ( mixer_input(input) == TRUE ) 
	{
		if ( mixer_output(output) == TRUE )
				return_val = TRUE;
	}
	else
	{
		return_val = FALSE;
	}

	return return_val;
}
/*------------------------------------------------------------*/

/* style 4 */
/* varify 함수를 따로 두어 사용한 경우 */
/*   i) if 문을 단계적으로 사용, TRUE 를 우선으로 검사 */
bool mixer(int input, int output)
{
	if ( mixer_varity(input, output) == TRUE )
		if ( mixer_input(input) == TRUE ) 
			if ( mixer_output(output) == TRUE )
				return TRUE;

	return FALSE;
}


/* style 5 */
/*   ii) if 문을 순차적(?)으로 사용, FALSE 를 우선으로 검사 */
bool mixer(int input, int output)
{
	if ( mixer_varity(input, output) == FALSE )
		return FALSE;
	...
	return TRUE;
}



/*------------------------------------------------------------*/


/***** mixer_varify *****/

/* style 2 */
bool mixer_varify(int input, int output)
{
	if (input == LD2LO || input == RD2LO)
	{
...	return FALSE;
}

위의것이 개인적으로 마음에 듭니다.

되도록이면 if문에서 {, }은 붙이는것이 좋다고 개인적으로 생각하며

bool 을 BOOL 로 하는것이 좋을것 같은데요

위에서는 c함수일것 같은데
C++에 bool 형이 존재합니다.

또한 함수에서 input과 output이 수정되지 않으므로 const 연산자를 써주는것이 좋을듯 싶습니다.

BOOL mixer_varify(const int input, const int output)

mixer_varify 함수내에서
BOOL mixer_input_varify(const int data);
BOOL mixer_output_varify(const int data);
함수를 만들어 사용하는것이 좋을것 같습니다.

속도가 중요하다면 inline 함수로 만드시는것도 좋겠지요^^

모듈로 만드신다면 static 함수도 생각해 보시구요.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

doldori의 이미지

이 정도로 하면 간결해지지 않을까요?

bool mixer(int input, int output)
{
    return mixer_verify(input, output) &&
           mixer_input(input)          &&
           mixer_output(output);
}

bool mixer_verify(int input, int output)
{
    switch (input)
    {
    case LD2LO:
    case RD2LO:
        return output == LI2LO || output == RI2LO;

    case LD2MO:
    case RD2MO:
        return output == LI2MO || output == RI2MO;

    case LD2RO:
    case RD2RO:
        return output == LI2RO || output == RI2RO;

    default:
        return false;
    }
}
익명 사용자의 이미지

두분 모두 감사합니다.. 코드 정리하는데 많은 도움이 되었습니다..

Fe.head의 이미지

doldori wrote:
이 정도로 하면 간결해지지 않을까요?
bool mixer(int input, int output)
{
    return mixer_verify(input, output) &&
           mixer_input(input)          &&
           mixer_output(output);
}

조심스레 이야기 해보면

소스는 간결해 보이는데 만약 debug할일이 생기면 골치 아픕니다.

디버깅시에 어디서 에러가 났는지 애매 모호 하기 때문입니다.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

pinetr2e의 이미지

jmjarre wrote:

bool 을 BOOL 로 하는것이 좋을것 같은데요

위에서는 c함수일것 같은데
C++에 bool 형이 존재합니다.

주제와 관계 없는 예기지만.....

C++ 에는 bool, true, false가 keyword 로 존재하고

반면 C99 에는 '_Bool' 이 boolean type을 위한 keyword로 존재합니다. 대신 <stdbool.h>을 통해 bool, true, false 가 macro로 제공되기 때문에, c++ 과 동일하게 bool,true,false를 써도 무망할것 같습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.