search:

Named parameter Idiom

10 Feb 2015

Named Parameter란?

C++ Faq를 읽다가 Named Parameter Idiom를 알게 되었다. Named parameter를 지원하지 않는 C/C++, Java 계열에서는 함수 호출 시 parameter 위치가 parameter의 의미를 결정한다. 따라서 함수를 호출할 때 몇 번째 parater가 어떤 것을 의미하는지 알고 있어야 한다. 예를 들어 다음의 함수를 보자.

make_point(10, 5);

make_point()는 점(Point)를 생성하며 Point는 x, y 좌표로 구성이 된다. 그렇다면 위의 함수만을 보고 10이 x인지 y인지 알 수 있는가?

Named Parameter를 지원하는 Object-C (나는 한번도 못 써봤음)에서는 다음과 같이 함수를 호출할 때 parameter의 이름과 값을 동시에 지정할 수 있다고 한다. (출처 : 위키피디어)

[window addNewControlWithTitle:@"Title"
                     xPosition:20
                     yPosition:50
                         width:100
                        height:50
                    drawingNow:YES];

Named Parameter Idiom

C/C++, Java에서는 언어 자체적으로 Named Parameter를 지원하지 않으므로 다음과 같은 Idiom을 통해서 비슷한 효과를 볼 수 있다. (출처 : C++ Faq - Named Parameter Idiom)

File f = OpenFile("foo.txt")
           .readonly()
           .appendWhenWriting();

File 객체에 대한 설정을 생성자의 parameter로 넘기게 되면 parameter 개수도 많고, 실수할 가능성이 많다. Named Parameter Idiom을 이용하면 parameter 위치를 기억할 필요가 없고, 헷갈림도 방지할 수 있다.

여기서 말하는 “헷갈림”이란, 다음과 같다. 예를 들어 다음과 같은 OpenFile()이 있다고 할 때,

File f = OpenFile("foo.txt", true, false);

parameter가 3개 밖에 안 되지만, true가 read_only에 대한 것은지 append에 대한 true인지 알기가 어렵다.

실제 Faq에 나온 예는 위의 것보다 설정하는 parameter가 많다. 다음 전체 예이다.

File f = OpenFile("foo.txt")
           .readonly()
           .createIfNotExist()
           .appendWhenWriting()
           .blockSize(1024)
           .unbuffered()
           .exclusiveAccess();

명확성을 위한 다른 방법

1) enum 활용하기

Named Parameter든 뭐든 그들의 목표는 code의 가독성을 높히고 실수를 방지하는 것이다. boolean 변수는 true/false 대신 enum을 활용하는 것이 좋다.

enum ENUM_READ_ONLY = {READ_ONLY, READ_WRITE};
enum ENUM_APPEND = {APPEND, TRUNCATE};

File f = OpenFile("foo.txt", READ_ONLY, TRUNCATE};

이렇게 하면 가독성이 true/false로 전달되는 것보다 가독성이 높아지고 실수를 미연에 방지할 수 있다.

2) Class 활용

다음과 같이 parameter로 전달할 내용들을 모두 1개의 Class로 만들어도 된다.

class FileOption
{
public:
    bool read_only_;
    bool append_;
};


FileOpen option;
option.read_only_ = true;
option.append_ = false;

File f = OpenFile("foo.txt", option);

위의 2 방법을 사용하는 경우, 만들어야 할 enum 혹은 class가 많아지는 단점이 있다.

결론

Named Parameter Idiom이든 enum이든 class든 서로 장단점이 있다고 생각된다.