2013-09-28 5 views
0

일부 코드를 리팩터링하는 동안 흥미로운 상황이 발생했습니다. 반환 값은 문자열이었고 호출 클래스 메서드 내에서 비교되었습니다.함수에서 반환 상태 및 문자열 가져 오기

문자열 비교가 비쌉니다. 반환 값이 bool 일 수 있다는 것을 알았지 만 예외가 발생하면 문자열에 로깅을 사용했습니다.

그래서 내 옵션 중 하나는

bool result = a.f(&status_string, other_args); 

과 같은 기능을 가지고 다음 status_string을 사용하는 것이 었습니다.

두 번째 옵션 :

std::pair<bool, string> result = a.f(other_args); 

그러나 세 번째 옵션 : 가장 우아한 해결책이의

bool result = a.f(other_args) and then query for `a.get_status()` for the message. 

어느 하나? 또는 boost::bind을 통해 a.f에 콜백을 전달하고 그 콜백에 문자열이 전달되었지만 코드가 더 이상 느슨하게 결합되지 않았습니다.

+0

로깅은 로깅 이외의 용도로 사용됩니까? – us2012

+0

그냥 로깅하고 더 이상 없습니다. – Fanatic23

+3

그렇다면 어느 솔루션도 우아하지 않다고 생각합니다. 단순히 함수가 로깅을 수행하도록하고 어떤 방식 으로든 함수를 반환하지 않습니다. – us2012

답변

0

위의 내 의견을 확대하겠습니다.

프로그램 논리와 관련하여 함수의 결과가 bool ean이고 상태 메시지 만 기록하면 메시지를 반환하고 호출자가 로깅을 수행 할 필요가 없습니다 이는 인터페이스에 관련없는 매개 변수를 도입하기 때문입니다.

대신, 함수가 로깅을하자 :

bool myfun(someobj s) { 
    ... 
    if (cond1) { 
    logger.log(message); 
    return false; 
    } 
    else 
    return true; 
} 

이 문제에 대한 또 다른 관점은 왜 전혀 두 개 이상의 메시지 문자열을해야합니까?

if (myfun(s)) { 
    dostuff(); 
    logger.log(msg1); 
} 
else 
    ... 

이상의 두 가지 결과가있는 경우, 어쩌면 당신이 안 : 함수는 두 가지 결과가있는 경우,이 쉽게 호출에 의해 처리 할 수있는 경우에 로그인 할 유일한 두 가지 일이있다 bool을 반환하고 enum을 반환 하시겠습니까? 아니면 예외 처리를 사용합니까?

0

메시지가 "예외가있는 경우"에만 사용되는 경우 get_status 모델을 사용하는 것이 가장 좋은 해결책이 될 수 있습니다. 예외적 인 경우는 예외적으로 발생하기 때문에 정기적으로 발생하는 것이 아닙니다. 그렇다면 공통적으로 사용되지 않는 문자열을 유지 (생성, 복사, 삭제)하는 것이 왜 공통 코드에 부담이됩니까?