변수의 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자.


비밀번호가 충분히 길 경우에 해당 비밀번호를

암호화하여 반환하는 함수가 있다.




string encryptPassword ( const string& password){


string encrypted;  // 1번

if(password.length() < MinimumPasswordLength) {

throw logic_error ("Password is .... ");

}

//2번 string encryped

...  // 암호화 진행부분

return encrypted;

}


1번의 경우 encryped 객체는 길이 점검에서 예외가 던져지게 되면

안 쓰여질 확율이 있다. 따라서 불필요한 생성자 소멸자

비용을 지불하게 된다. 2번의 경우는 위와 같은 불필요한

비용을 지불하진 않지만 기본생성자가 호출된 후에

또 다시 대입을 해야하는 구조이기 때문에 여전히

비용에 대해 자유로울 수 없다.




void encrypt(string &s);

위 함수에서 암호화를 진행한다고 할 때


string encryptPassword ( const string& password){


if(password.length() < MinimumPasswordLength) {

throw logic_error ("Password is .... ");

}


string encrypted(password);

encrypt(encrypted);

return encrypted;

}




encrypted가 생성될 때 매개변수로 들어온

password로 초기화가 되고 있다.

변수의 정의를 늦줘서 기본생성자 호출

그리고 대입에 대한 불필요한 비용을 

최소화 하고 있다.


루프에 대해선 어떻게 해야 할까?


1번.

widget w;

for( ... ){

w = i;

}

2번.

for( ... ){

widget w(i);

}


1번의 경우 생성자와 소별자가 1번씩 호출되며

대입이 여러번 일어나고 있다. 2번의 경우에는

생성자와 소멸자의 호출이 여러번 일어나고 있다.




대입에 들어가는 비용이 생성자 소멸자 쌍보다

적게나오는 경우 1번 방법이 좋다. 하지만 A는

w의 유효범위가 넓어지기 때문에 프로그램의

이해도와 유지보수성이 역으로 안좋아질 수 있다.




POINT!!

변수 정의는 늦출 수 있을 때까지 늦추자.

+ Recent posts