Recent Posts
Recent Comments
Link
관리 메뉴

NaggingMachine

코드의 가독성, 매개 변수는 요렇게.. 본문

TechnoBabbler

코드의 가독성, 매개 변수는 요렇게..

naggingmachine 2009. 4. 1. 13:16
얼마전 HS님이 심심풀이로 만들어본 한글 Naming~ ㅋ라는 글을 하나 올리셨습니다. 변수명에서 유니코드가 지원되는 사실에 착안해서 간단하게 소스코드를 만들어주셨는데, 그 글을 보고 있자니 코드의 가독성을 위해 개발자가 취할 수 있는 여러가지 방법들이 떠올랐습니다. 제가 프로그래밍 강의를 하면서 자주 써먹었던 내용인데요,

간단한 예를 하나 들어보면, 다음과 같이 함수에 넘기는 여러가지 매개 변수들이 있을 수 있습니다.

int foo (char * szFirstName, char * szLastName, char * szFullName);

이 함수는 첫번째와 두번째 매개 변수인 szFirstName과 szLastName을 전달하면 이름을 조합해서 szFullName으로 이름을 넘겨주는 기능을 제공합니다. 하지만 만약 저 코드만 딸랑 있다면 foo 함수를 사용하는 사용자는 마지막 매개 변수인 szFullName도 자신이 작성해서 넘겨줘야 하는건지 아니면 전달받는 것인지를 쉽게 판단할 수 없게 됩니다. 소스 코드를 볼 수 있다면 구현부를 보고 판단할 수 있겠지만, 그나마도 불가능하다면 이리저리 테스트를 해보는 수 밖에요.

이 경우 여러 가지 방법으로 코드의 가독성을 높일 수 있습니다.

- 함수의 이름을 BuildFullNameFromFirstNameAndLastName 과 같이 함수의 기능을 설명할 수 있도록 변경합니다. 그런데 함수 이름이 너무 길죠?

- szFullName을 foo 함수의 리턴 값으로 지정합니다. 이렇게 되면 함수의 성공 및 실패, 또는 그 밖의 예외적인 상황에 대한 상태값을 반환하기가 어려워집니다.

- const char * szFirstName, const char * szLastName, char * szFullName 과 같이 선언함으로써 szFullName이 변경 가능하다는 것을 명시합니다. 이 방법은 szFirstName과 szLastName의 경우에는 컴파일러의 도움으로 변경이 불가능함을 강제할 수는 있지만 개발자에게 큰 도움은 안될것 같네요.

- FullName이라는 클래스를 만들어서 szFirstName과 szLastName을 property로 전달해주면 전체 이름을 얻을 수 있도록 구성합니다. 그런데 그러기에는 부담이 너무 크죠?

어떤 방법을 사용할 것인지는 여러분의 판단에 맞기겠지만, 저는 주로 in, out, inout과 같은 별도의 키워드를 지정해서 사용해오고 있습니다. 이 함수는 다음과 같이 변경이 가능하겠습니다.

#define IN
#define OUT
#define INOUT

int foo (IN char * szFirstName, IN char * szLastName, OUT char * szFullName);

사실상 IN과 OUT은 컴파일러 입장에서보면 아무 의미가 없지만, 사람이 읽고 이해하기에는 이보다 좋은 방법이 없는것 같습니다.

여러분들은 어떤 방법을 사용하고 계시나요? ^^