2009-06-02 4 views
2

추가 기능을 추가 할 필요가있는 기존 메서드 또는 함수가 있지만 코드의 다른 곳에서 메서드를 사용하고 싶지 않습니다. 예 :기존 API 확장 : 기본 인수 또는 래퍼 함수를 ​​사용 하시겠습니까?

int foo::bar(int x) 
{ 
// a whole lot of code here 
return 2 * x + 4; 
} 

은 코드베이스에서 널리 사용됩니다. 이제는 매개 변수로 4를 만들 필요가 있지만, foo :: bar를 호출하는 코드는 여전히 예상대로 받아 들여야합니다. 나는 확장하고 기존의 방법을 이름을 변경하고 같은 새에

int foo::extended_bar(int x, int y) 
{ 
// ... 
return 2 * x + y; 
} 

int foo::bar(int x) 
{ 
return extended_bar(x,4); 
} 

그것을 포장 또는 나는

int bar(int x, int y=4); 

같은 헤더 파일에 기본 인수를 선언해야하고 단지 기능을 확장해야

int foo::bar(int x, int y) 
{ 
// ... 
return 2 * x + y; 
} 

각 변형의 장점과 단점은 무엇입니까?

+0

내게 물질이 아닌 스타일처럼 보입니다. 둘 다 실행 가능한 솔루션입니다. – Robert

답변

7

일반적으로 기본 매개 변수 대신래퍼 함수를 ​​사용합니다 (대부분의 경우 오버로드).

이유는 이전 버전과의 호환성의 두 가지 수준이있다이다 :

  1. 갖는 소스 레벨이 이전 버전과의 호환성은 변경 사항없이 호출 코드를 다시 컴파일해야 함을 의미 새로운 기능 서명 때문에 이전 버전과 호환됩니다. 이 수준은 두 가지 모두로 달성 할 수 있습니다. 기본값 및 래퍼/오버로드.

  2. 더 높은 레벨은 바이너리 레벨 역 호환성입니다. 이는 다시 컴파일하지 않아도 작동합니다. 호출 코드에 액세스 할 수없는 경우 DLL과 같이 바이너리 형식으로 함수를 배포한다고 가정 해보십시오. 이러한 경우 서명은 기본값이 아닌 동작을하도록 정확히 동일합니다. 호환성의 수준을 떨어 뜨릴 것입니다 .

래퍼 함수의 또 다른 장점입니다 - 응용 프로그램이 어떤 종류의 로깅이있는 경우 - 당신이 미래 버전에서는 사용이 될 것이다 기존의 기능에 경고를 덤프하고이 새로운를 사용하는 것이 좋습니다 것을 할 수 있습니다 하나.

0

C++을 사용하면할수록 기본 함수 매개 변수가 적어집니다. 나는 싫어하는 이유를 정확히 지적 할 수는 없지만, 나는 그것을 사용하면 나중에 언제든지 제거하게된다. 그래서 내 (주관적인) 투표는 새로운 명명 된 기능을 위해 진행됩니다 - 이름은 당연히 이전 것과 동일 할 수 있습니다.

0

나는 암묵적인 행동이 (모든) 악의 뿌리 중 하나라고 개인적으로 믿습니다.

유지 관리자 또는 호출자가 호출 대상의 ID를 알아 내기 힘들다면, 특히 주요 API의 일부인 경우에는 매우 강력한 근거가 있어야합니다.

따라서 기본 작업의 옵션에 대해 강하게 반박합니다.

또한, 특정 함수가 다른 수의 매개 변수로 호출 될 수 있다면 본질적으로 기능의 두 버전이 서로 다르거 나 너무 많이 수행하고 있다고 생각합니다. 이 구분은 아마도 이름에 있어야하며 아마도 "_extended"보다 더 의미가 있어야합니다.

+0

마지막 단락에 동의합니다. bar_with_adjustable_summand (x, y) 등이되어야합니다. 하지만 그렇지 않으면 변경되지 않은 함수에서 추가 매개 변수를 제어해야하는 경우 첫 번째 문제에 대한 해결책은 무엇입니까? – balpha

관련 문제