2009-03-31 3 views
3

나는 직장에서 구형 C 코드 기반을 가지고 있으며 아래의 스타일에서 많은 함수 구현을 발견한다. DoStuff 사용C가 매개 변수를 과도하게 사용합니까?

char *DoStuff(char *inPtr, char *outPtr, char *error, long *amount) 
{ 
    *error = 0; 
    *amount = 0; 

    // Read bytes from inPtr and decode them as a long storing in amount 
    // before returning as a formatted string in outPtr. 

    return (outPtr); 
} 

:

myOutPtr = DoStuff(myInPtr, myOutPtr, myError, &myAmount); 

을 나는 꽤 둔한 발견하고 나는 내가하고 결국 비슷한 기능을 구현해야 할 때 사용 NewDoStuff

long NewDoStuff(char *inPtr, char *error) 
{ 
    long amount = 0; 
    *error = 0; 

    // Read bytes from inPtr and decode them as a long storing in amount. 

    return amount; 
} 

을 :

myAmount = NewDoStuff(myInPtr, myError); 
myOutPtr += sprintf (myOutPtr, "%d", myAmount); 

나는 할 수 없다. p가 있지만 위 예제에서 누락 된 것이 있다면 그 유형의 접근 방식을 사용하는 것이 좋은 이유입니까?

+0

+ + sprintf는 무엇입니까? – Uri

+0

http://msdn.microsoft.com/en-us/library/ybk95axf(VS.71).aspx는 문자열을 쓰고 포인터를 앞으로 쓴 바이트 수만큼 앞으로 이동합니다. – sipwiz

+0

=가 아니고 + =가 아니어야합니까? –

답변

1

하나의 장점은 코드에서 이러한 함수에 대한 호출이 많으면 sprintf 호출을 반복해서 반복해야하는 것이 지루해집니다.당신은 같은 것을 할 수 있도록

또한, 밖으로 포인터를 반환하는 것이 가능하게 :

myAmount = DoNewStuff(myInPtr, myError); 
myOutPtr += sprintf("%d", myAmount); 
myOther = DoOtherStuff(myInPtr, myError); 
myOutPtr += sprintf("%d", myOther); 
1

C 표준 라이브러리 스타일입니다. 반환 값은 함수 호출의 연결을 돕기위한 것입니다.

또한 DoStuff은 IMO보다 깨끗합니다. 그리고 실제로는 snprintf을 사용해야합니다. 그리고 버퍼 관리의 내부 변경은 코드에 영향을 미치지 않습니다. 그러나 이것은 더 이상 NewDoStuff에 해당하지 않습니다.

+0

버퍼 관리의 내부 변경 사항에 대한 약간의 의미는 무엇입니까? 나는 틀릴 수도 있지만 모든 포인터를 두 가지 방법으로 동일하게 생각합니다. – sipwiz

+0

@sipwiz : "DoStuff"는 "myOutPtr + = sprintf (myOutPtr,"% d ", myAmount);" 부품. 그것은 위의 진술을 자극했다. – dirkgently

0

당신이 제시 한 코드는 하나의 고장 당신이 본질적으로 설명하고 있다는 것 무엇의 sprintf의 결과에 약간 불분명 (예를 들어, 당신은 왜 추가 myOutPtr.

그러나, 일반적이다 한 가지를하는 함수와 다른 것을하는 코드 (연결)에 두 가지를하는 두 가지 기능이 있습니다.

두 가지 기능으로 책임을 분리하는 것이 좋습니다.하지만이 기능을 별도로 수행하고자 할 것입니다. 연결 및 서식 지정은 실제로 명확하지 않습니다.

I 또한 여러 함수 호출을 여러 호출로 분리 할 때마다 코드 복제가 생성됩니다. 코드 복제는 결코 좋은 생각이 아니므로이를 수행하는 함수가 필요하며 원래 DoStuff와 비슷한 형태로 끝나게됩니다.

그래서 저는 이것에 관해 할 수있는 일이 많지 않을지 확신하지 못합니다. 비 OOP 언어의 한계 중 하나는 엄청난 양의 매개 변수를 보내야한다는 것입니다 (구조체를 사용하지 않는 한). 거대한 인터페이스를 피할 수 없을 수도 있습니다.

0

NewDoStuff를 호출 할 때마다 sprintf 호출을 수행해야한다면 반복적으로 반복하고 있으므로 DRY 원칙을 위반하는 것입니다. 포맷을 다르게해야한다는 것을 알게되면, 포맷을 변경하는 대신 모든 위치에서 변경해야합니다.

0

으로 : 새로운 접근 방식을

DoOtherStuff(DoStuff(myInPtr, myOutPtr, myError, &myAmount), &myOther); 

를, 해당하는 코드는 더 자세한 꽤 많은입니다 엄지 손가락의 규칙, 만약 내 함수 중 하나에 대한 인터페이스가 110 열을 초과한다면, 나는 구조를 사용하는 것을 강력하게 바라본다. (만약 내가 최선의 접근법을 택한다면). 내가하지 않기를 원하는 것은 5 가지 일을하는 함수를 5 가지 함수로 나누는 것입니다. 함수 내의 일부 기능은 유용하지 않고 독자적으로 필요하지 않습니다.

첫 번째 기능을 선호하지만 표준 C 스타일에도 익숙합니다.

관련 문제