메소드 매개 변수를 재사용하는 것은 나쁜 습관입니까?


12

메소드 자체에서 메소드로 전달 된 값을 수정해야 할 때가 있습니다. 예를 들어 다음과 같은 방법으로 문자열을 삭제하는 것이 있습니다.

void SanitizeName(string Name)
{
    Name = Name.ToUpper();

    //now do something here with name
}

Name인수가 참조로 전달되지 않기 때문에 이것은 순수하게 무해합니다 . 그러나 어떤 이유로 미래의 개발자가 모든 값을 ref로 전달하기로 결정하면 문자열을 위생 처리하면 메소드 외부의 값에 영향을 미쳐 결과가 나빠질 수 있습니다.

따라서 인수 자체에 다시 할당하는 대신 항상 다음과 같이 로컬 복사본을 만듭니다.

void SanitizeName(string Name)
{
    var SanitizedName = Name.ToUpper();

    //now do something here with name
}

이렇게하면 값이 전달되는 방식을 변경해도 메소드 외부의 진행 상황에 영향을 미치지 않지만 과도하게 편집증이되는지 궁금합니다.


1
그렇습니다. 나쁜 습관입니다. 그리고 무해하지 않습니다. 이 줄 Name = Name.ToUpper();Name변경 값으로 코드를 이해하기 어렵게 만듭니다 . 두 번째 예는 미래를 보장 할뿐 아니라 현재하고있는 일을 추론하기가 더 쉽습니다.
David Arno

2
그러나 어떻 if (param == NULL) param = default_value;습니까?
aragaer

예 / 아니오만큼 쉽지 않다고 생각합니다.
MrSmith42

3
경우 "미래의 개발자가 심판에 의해 전달 된 모든 값을하기로 결정" , 아마와 인수있을 것입니다 그 dev에, 매개 변수 재사용 참여 여부를 ;-) 솔직히, 하나는 값 전달 결정할 때 by ref것을 전달되지 않았다 어떤 이유로 든 로컬 액세스를 로컬이 아닌 액세스로 변환하기 위해서는 항상 결과를주의 깊게 확인해야합니다.
Doc Brown

2
나는 주로 변수를 다시 할당 하지 않는 패러다임에서 일 합니다. 이제까지. 소수의 변수를 재 할당해야하는지에 대해 어려움을 겪고 나머지 사람들과 함께 돼지를 짓는 것에 대해 걱정하지 않아도된다고 상상하는 것은 재밌습니다.
Karl Bielefeldt

답변:


10

프로젝트의 코딩 규칙에 달려 있다고 생각합니다.

나는 개인적으로 일식이 자동으로 final모든 변수와 매개 변수에 키워드를 추가하도록했습니다 . 이 방법으로 매개 변수가 재사용되는지 첫눈에 알 수 있습니다.

내 직장의 프로젝트에서는 매개 변수를 재사용하지 않는 것이 좋지만 예를 들어 호출 .trim()하거나 null경우에 기본값을 설정 하려는 경우 새 변수를 도입하는 것이 읽기 쉽지 않기 때문에 대부분의 경우 매개 변수를 재사용합니다. 매개 변수 재사용보다.

이름이 더 이상 컨텐츠를 참조하지 않으므로 매우 다른 컨텐츠를 저장하기 위해 매개 변수를 재사용하지 않아야합니다. 그러나 이것은 변수의 모든 reassigment에 대해 사실이며 매개 변수에 국한되지 않습니다.

따라서 팀과 함께이 문제를 다루는 코딩 규칙을 공식화하십시오.


0

보안 목적으로 정적 코드 분석기를 사용하는 경우 혼동 될 수 있으며 사용하기 전에 입력 매개 변수 변수를 검증하거나 소독하지 않은 것으로 생각됩니다. Name예를 들어, SQL 쿼리에서 사용 하는 경우 SQL 주입 취약점을 주장하여 설명하는 데 시간이 걸립니다. 그건 나빠. 반면에 실제로 입력을 삭제하지 않고 삭제 된 입력에 명확하게 명명 된 변수를 사용하는 것은 순진한 코드 분석기를 조용히하는 빠른 방법입니다 (거짓 부정적인 취약점 발견).


대부분의 경우 코드 분석기에 이것이 의도 된 것이며 눈에 띄지 않는 위험이 아님을 나타 내기 위해 어떤 종류의 주석 또는 특수 주석을 사용할 수도 있습니다.
MrSmith42

0

이에 대한 답은 누가 코드를 읽을 것인지에 따라 100 % 다릅니다. 어떤 스타일이 가장 도움이됩니까?

가장 일반적인 경우는 너무 많은 개발자가 함수 호출이 어떻게 작동하는지에 대한 정신 모델을 가지고 있기 때문에 함수 인수에 값을 다시 할당하지 않는 것입니다. 이 문제는 각 함수를 호출하는 인수의 값을 인쇄하는 디버거에 의해 악화 될 수 있습니다. 인수를 편집하면 이 정보가 기술적으로 올바르지 않으며 일부 실망 할 수 있습니다.

즉, 정신 모델이 바뀝니다. 특정 개발 환경에서 name"이 시점에서 이름을 가장 잘 표현한" 것이 바람직 할 수 있습니다 . 그 과정에서 값을 약간 수정 했더라도 작업중 인 변수를 인수에보다 명시 적으로 연결하는 것이 바람직 할 수 있습니다. 더 큰 객체를 생성하는 대신 특정 변수를 재사용하면 런타임에 상당한 이점이있을 수 있습니다. 결국 4GB 문자열로 작업 할 때 추가 사본 수를 최소화하는 것이 좋습니다!


-1

코드 예제와는 완전히 다른 문제가 있습니다.

분석법 이름은 SanitizeName입니다. 이 경우 이름삭제해야합니다 . 그것은 독자에게 함수를 알려주는 것입니다.

에만 이 기능을 일, 해야 할이 ,되는 살균 주어진 이름을 . 코드를 읽지 않으면 다음이 예상됩니다.

string SanitizeName(string Name)
{
    //somehow sanitize the name
    return Result;
}

그러나 당신은 당신의 방법이 단지 sanitizng 이상을 수행한다는 것을 암시합니다 . 코드 냄새가 나므로 피해야합니다.

귀하의 질문에 관한 것이 아닙니다 : 메소드 매개 변수를 재사용하는 것은 나쁜 습관입니까? 더 많은 것 : 부작용과 실행되지 않은 행동이 나쁜 습관입니까?

이에 대한 대답은 분명합니다. 그렇습니다!

Name 인수가 참조로 전달되지 않기 때문에 이것은 무해합니다. 그러나 어떤 이유로 미래의 개발자가 모든 값을 참조로 전달하기로 결정하면 문자열을 위생 처리하면 메소드 외부의 값에 영향을 미쳐 결과가 나빠질 수 있습니다

당신은 아무것도 반환하지 않음으로써 독자를 오도합니다. 메소드 이름은에 무언가를 하고 있음을 분명히 나타냅니다 Name. 결과는 어디로 가야합니까? 함수 서명으로 내가 사용 하지만void 읽은 결과는 id에 해를 끼치 지 않으며 결과에 대해 (명시 적으로) 알려주지 않습니다. 아마도 예외가 발생했을 수도 있습니다. 그러나 변경되지 않습니다 . 이것은 메소드 이름과 반대되는 의미입니다.NameName

문제는 부작용 보다 재사용 이 적습니다 . 부작용 을 방지하기 위해 변수를 재사용 하지 마십시오 . 부작용이 없으면 아무런 문제가 없습니다.


4
-1 원래 질문에 대한 답변이 아닙니다. 제공된 코드는 문제를 보여주기위한 샘플 코드 일뿐입니다. 제공된 샘플 코드를 "공격"/ 검토하는 대신 질문에 대답하십시오.
Niklas H

1
@NiklasH 이것은 질문에 완벽하게 대답합니다. 함수 내부의 매개 변수를 조작하고 TO가 실수로 사본 대신 참조로 작업하면 언급 한 것처럼 부작용이 발생하며 이는 나쁩니다. 이를 막기 위해 메소드 이름을 신중하게 선택하고 (루비의 '!'생각) 리턴 유형을 선택하여 변수를 변경할 것임을 나타냅니다. 변수를 변경하지 않으면 사본 만 사용하십시오.
Thomas Junk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.