반환 된 변수의 이름을 "result"로 지정하는 것이 좋습니까? [닫은]


44

메소드가 변수 이름으로 리턴하는 변수를 호출하는 것이 좋 result습니까?

예를 들어 :

public Zorglub calculate() {
    Zorglub result = [...]
    [...]
    return result;
}

아니면 유형별로 이름을 지정해야합니까?

public Zorglub calculate() {
    Zorglub zorglub = [...]
    [...]
    return zorglub;
}

나는 둘 중 하나를 선택해야한다면, 나는 전자를 선호하는 이유는 무엇입니까?

나는 주로 자바에 대해 생각하고 있습니다.


73
나는 또한 ofTheJedi그 목적으로 사용되는 것을 보았다 . 추천서가 아니라 내가 본 것입니다. Zorglub ofTheJedi = //...; return ofTheJedi;

7
나는 보통 그것을 "retval"(반환 할 가치)이라고 부르지 만 그것은 "result"와 거의 같으며 투표를 할 것입니다.
Zeta Two

5
모든 사람은 다른 대답을 가지고 있으며, 모두 비슷하지만 다르고 유효합니다. 질문은 기꺼이 주관적이지 않지만 대답은 있습니다. 여론 조사에 더 가깝습니다.
ZJR

16
변수로 "결과"는 괜찮지 만 함수로 "계산"하는 것은 절대 그렇지 않습니다.
Kaz Dragon

2
많은 전 델파이 프로그래머들과 함께 일하십니까?
피터 터너

답변:


48

이것이 메소드 변수 인 경우 실제로 가독성에 따라 다릅니다.

변수 선언과 메서드 반환 형식에 모두 형식 이름이 있으므로 변수 result의 역할을 설명하는 것이 좋습니다.


40

변수 이름이이면 교차 읽기가 더 쉬워집니다 result. 이것은 당신의 의도를 명확하게합니다.


2
+1 이것이 요점입니다. 코드를 살펴보면 어떤 맥락에서 어떤 결과가 의미가 있는지 알고 있습니다.
Xeoncross

1
변수 유형을 사용하면 반환 할 것이라는 것을 이해하는 데 도움이되지 않습니다. 이 간단한 예제에서는 스크롤하거나 보지 않고 리턴을 보는 것이 더 쉽지만 함수의 리턴 값이 무엇인지 미리 알 수 있습니다. 예제에서와 같이 초기화하는 것도 중요합니다.
nycynik 2013

17

반환 변수가 필요한 경우 (실제로는 거의 발생하지 않음) 항상 호출 ret하고 함수 헤드 바로 아래에 정의합니다. 이 함수는 이미 이름을 가지고 있는데, 그것이 반환하는 것에 대한 모든 것을 말합니다.

만약 내가 myFunction내가 할 수 그것의 반환 변수의 이름을 myFunctionReturnValue정확히 똑같은 말을 만 나는 명시 적으로 매번 그것을 말해야 할 것입니다. 함수는 일반적으로 짧아야하므로 그러한 명시 성이 필요하지 않습니다. 그리고 내가 길을 잃어도 선언으로 건너 뛸 수 있고 함수 정의 바로 아래에 떨어질 것입니다.

그러나 암시 적으로 (like ret또는 result) 또는 명시 적으로 (like myFunctionReturnValue또는 myFunctionResult) 상태 가 아닌 다른 이름 은 현재 함수 반환 변수라는 것이 너무 일반적입니다.

두 번째 예 zorglub에서는 끔찍한 선택입니다. 모든 선언은 실제로 변수가 생성되었다는 것입니다. 그 이름은 이름 바로 옆에있는 형식 주석과 같습니다. int someInt또는 만큼 도움이됩니다 Zorglub z.

첫 번째 예제에서 코드를 볼 때 먼저 함수 이름을보고이 함수가를 계산한다는 것을 알 수 Zorglub있습니다. 두 번째 줄을 읽었을 때 "OK, 여기에 zorglub이 반환 될 것입니다. 그러나 그것은 곧바로 반환 될 수 없으므로 result변수에 저장됩니다. " 값을 다시 할당하지 않으면 final 변수를 선언하여 전달하는 것이 가장 좋습니다.) 그런 다음 "지금 반환되기 전에 어떻게되는지 보자"고 생각합니다. 첫 번째 예제와 달리 실제로 변수 보다 더 이상 읽을 필요는 없습니다. 변수가 변수 라는 것을 알기 위해 반환 될 것이며 함수 본문에서 이해하고 싶다면 따르고 싶습니다.

스파르탄 프로그래밍 을 읽으십시오 . 이것은 오히려 질문과 관련이 있습니다.


8
"zorglub은 끔찍한 선택"입니다. 어떤 상황에서도 변수 이름을 가질 이유가 없습니다. 이는 유형 이름 (초기 자본을 뺀 값)과 동일합니다. 선언은 변수의 유형을 알려줍니다-유형 뒤에 변수 이름을 지정하는 것이 변수 x1, x2, x3 등을 호출하는 것보다 낫지 않습니다. 변수의 이름은 변수가 무엇을 위해 무엇을하는지 표현해야합니다. 이 특별한 경우 변수에 대해 선호하는 이름은 toReturn입니다. 변수는 반환 할 객체를 참조하기 때문입니다. 사실, 많은 변수 이름이 "to"로 시작합니다.
다우드 이븐 카림

21
@DavidWallace-절대 너무 강하다. 라는 수업이 Container있습니다. 수량을 수정하는 메소드가 있다면 메소드 var container = getContainer(id); container.Quantity += 1; 의 컨텍스트가 단일 컨테이너에서만 작동하는 경우 확실히 읽을 수 있다고 말할 수 있습니다 . 그것을 부르는 것은 theContainerWeAreGoingToAdjustTheQuantityOf우스운 일입니다.
Scott Whitlock 2012

4
@David, 동의하지 않습니다. 각각 다른 유형 (예 : 사용자, 관리자 및 부서)의 여러 로컬 변수가있는 상황을 살펴 보겠습니다. 그리고 작업이 사용자를 부서 및 관리자 팀에 연결하는 것이라고 가정하십시오. 이럴 단순히이 사용자 인스턴스를 호출하는 완벽 OK입니다 user(반대로 userToJoinThisDepartmentAndManager? 또는 무슨 일이 당신의 선택이 될 것입니다?)
페테르 토록

10
작은 nitpick : "ret"또는 "rv"또는 다른 약식 결과 / returnValue가 표시되는 것을 싫어합니다. "결과"는 그리 길지 않으며 아무도 문자를 보존 할 필요가 없습니다.
Kristopher Johnson

2
@KristopherJohnson : "결과"는 그리 길지 않지만 "반환 가치"를 의미하지는 않습니다. 리턴 값이 항상 계산 결과는 아니고 반대로 계산 결과가 항상 리턴 값은 아닙니다. 나는 당신이 당신의 리턴 값의 이름을 수도있을 것 같군요 returnValue하지만 ret처럼 전통 intchar.
ruakh

12

두 번째 예에서는 가미하여있는 형태 로 결과 가 무엇인지를 .

Zorglub zorglub;

Zorglub이라고 두 번 말합니다. 메소드 반환 유형을 읽는 데 귀찮은 경우 세 번. 하나,

double variance;

예를 들어, 프로그램 의미론에서 반환 값의 의미 에 대한 실마리를 제공합니다 . result메소드의 크기에 따라 단순히 호출하는 것보다 명확하지 않을 수도 있고 그렇지 않을 수도 있습니다 . 이는 각 메소드 IMO에 대한 판단 호출입니다.


8

당신이 Zorglub이 당신의 방법에서 객체 많은 노는 경우에, 당신은 실수로 잘못된 반환 및 / 또는 당신은 다른 사람의 이름을 유혹 할 수있는 "수" zorglub1, zorglub2

당신이 이름 result을 지으면, 그런 실수를 할 기회가 없습니다. 게다가 나는 그것이 좋은 이름이라는 것을 안다. 또한 본 적이 returnedValue또는 returnedObjectA가 긴 비트 있지만 여러 번, 그것은 또한 분명하다.


5

나는 개인적 result으로 변수 이름으로 사용 하는 것이 완전히 편안하지 않습니다 . 공평하게 말하면 관련 값이 일부 계산의 결과라는 것을 알 수 있습니다. 그러나 프로그램에서 사용되는 변수 / 필드의 약 90 % 이상이 사실이라고 생각합니다.

또한 여러 다른 답변이 언급했듯이 메소드 / 함수에서 반환 할 값을 표시하는 데 사용될 수 있습니다. 그러나 메서드를 짧게 유지하고 한 가지 작업에만 집중하고 단일 추상화 수준에 일관되게 유지하면 로컬 변수가 많지 않으므로 메서드가 무엇을 반환하는지 알기가 쉽지 않습니다.

그래서 나는 메서드를 짧고 깨끗하게 유지하고 변수의 이름 을 묶어 메서드 내부의 로컬 역할이 아니라 보유한 값 의 의미 를 표현하도록 선호합니다 . 그러나 (예 : 레거시 코드에서) Zorglub result보다 확실히 이해하기 쉬울 수 있습니다 Zorglub zorglub.


12
일부 계산 result의 결과이기 때문에 호출되지 않습니다 . 계산 의 결과이기 때문에 호출 됩니다. 그것은 가장 구체적인 의미가 아닌 경우에도 의미 IMO로 작동합니다. 의미를 표현하는 것은 황금이지만 의도관용구 도 가치가 있습니다. 이 경우에는 약간의 상충 관계입니다. result
Supr

@Supr : 다른 계산의 결과를 설명하기 위해 어떤 이름을 사용 하시겠습니까? 다음 문장이나 두 문장에서만 사용됩니다 (예 : if (result >= 0) numChars+=result; else break;문제의 계산에서 그 의미가 분명합니까?) 그 것이다 로부터 반환 호출 할 필요가 기능 ret값 동안, 마지막 호출 된 함수에서 반환이 있어야한다 result. 참고 result함수의 반환 값은 예를 들어, 양 또는 오류 코드 중 하나를 나타낼 수 있으면 더 긴 이름보다 더 의미가있을 수 있습니다.
supercat

@ supercat, 나는 계산이 무엇인지 또는 어떤 용도로 사용되는지에 따라 이름을 지정할 것입니다. 다음 계산에서만 사용 되더라도 이름이 잘 지정되면 가독성에 도움이됩니다. 귀하의 예에서 나는 그 의미 result가 무엇인지 또는 코드가 실제로 더 높은 수준에서 무엇을 하는지 전혀 모른다 . 그 가치가 어디에서 왔으며 무엇이 무엇인지 알기 위해 설정되어있는 곳을 참조해야합니다. 무언가 더 투명 addedChars하거나 matchedChars코드가 무엇을하고 있는지 밝히는 데 도움이되고, 이것과 관련을 정신적으로 저글링 할 필요가 없습니다 result = ...:)
Supr

@Supr : 문제는 많은 경우에 다른 반환 값 범위가 다른 것을 의미 할 수 있다는 것입니다. 예를 들어, 지정된 크기의 버퍼로 패킷을 읽는 루틴은 패킷이 수신 된 경우 바이트 수를 리턴하거나, 버퍼에 비해 너무 큰 패킷이 보류 중임을 나타내는 음수를 리턴 할 수 있습니다. 또는 다른 오류를 나타 내기 위해 실제로 큰 음수입니다. 반품을 저장 한 result다음 해당 기준과 비교하여 확인하면 모든 이름을 포함하는 설명적인 이름을 찾는 것보다 자연스러워 보입니다.
supercat

@ supercat, ret대신에 사용하는 것이 좋습니다 result. 약어로 명사와 비슷하지 않기 때문에 내 의견으로는 조금 덜 명확하지만 일관되게 사용하면와 같습니다 result.
Supr

1

나는 개인적 result으로 함수 / 메소드에서 반환되는 값 의 이름 을 사용합니다 . 그것이 반환되는 값임을 명시 적으로 만듭니다. 동일한 유형의 변수가 둘 이상있을 수 있으므로 유형별로 이름을 지정하는 것은 유용하지 않습니다.


음, 반품하기 전에 '반품'이라고 말할 것이라는 사실은 충분히 명백합니다. 당신은 당신이 그것으로 무엇을 할 것인지, 지금은 '어떻게'설명해야합니다. 그것을 총계, 결과 또는 목적을 설명하는 다른 것으로 부르지 않겠습니까? 그러면 코드가 "총계 반환"또는 유사하게 준비됩니다.
Dave

@Dave 반드시 필요하지는 않습니다. 특히 같은 유형의 모든 객체가 반환 될 수있는 동일한 유형의 객체가 몇 개있는 경우이 방법의 목적은 반환 할 적절한 객체를 파악하는 것입니다.
Andy

@ 앤디 나는 당신의 요점을 알지만 실제로는 그런 함수를 작성하는 것을 상상할 수 없습니다. 그것이 그러한 함수를 작성하는 이유라면, 더 이해하기 쉬운 작은 함수로 나뉘어 야 할 것 같습니다.
Dave

1

차이점이 뭐야? 거기에 똑같은 일을 할 수있는 2 개의 다른 단어가 있습니다. 그래서 실제 문제는 어느 것이 당신에게 더 명확하게 들리는 것입니까?

"결과"또는 "zorglub"

내가 사용하는 선호 ZorglubResult것을 볼 수있는 스타터 에서 결과를 반환 Zorglub 당신이 볼 수있는 다른 사용자가 가질 수있는 결과와 자사의 결과와 비교하기 쉽게 ...


1

유형별로 이름을 지정해야합니까?

아뇨. 이것을 시스템 헝가리어라고하며, 필요할 때마다 변수의 유형을 표시 할 수있는 프로그램을 사용한다는 아이디어로 인해 사소한 구식입니다.


1

당신이 이름을 필요할 때마다 어떤 코드에서, 당신은 설명 의미하고, 읽을 수있는 이름을 제공해야합니다. 반환 변수의 경우 사람들이 명명에 대해 만족스러워하는 경향이있는 좋은 예입니다.

명확하게 이름이 지정된 함수가 있고 한 줄의 코드 만 필요한 경우 이름을 완전히 건너 뛸 수 있습니다. 분석법을 짧고 단일 목적으로 삼는 것이 항상 목표로 삼아야 할 이상적입니다. 그러나 때로는 여러 줄의 코드로 함수를 완료해야하는 경우가 있습니다. 이러한 경우 함수의 목적에 맞게 변수의 이름을 지정하는 것이 좋습니다.

함수의 목적이 계산 또는 결정 알고리즘의 결과를 반환하는 것이라면 result변수가 사용하기에 완벽하게 적합한 이름이지만 함수가 목록에서 항목을 반환하면 어떻게됩니까? 함수가 수학이나리스트와 관련이없는 다른 목적을 수행한다면 어떻게 될까요? 이러한 경우 함수가 작성된 이유와 관련된 의미있는 이름을 변수에 제공하는 것이 좋습니다. 물론 다른 결과와 충돌하지 않는 이름이기 때문에 원하는 경우 간단히 결과를 사용할 수 있지만 가독성 관점에서 변수를보다 의미 있고 문맥에 따라 명명하는 것이 더 합리적입니다.


0

나는 그것들을 결합하는 것을 좋아하고 그것이 무엇인지 그리고 그것이 반환되어야한다는 것을 보여줍니다.

따라서 귀하의 예에서 결과는 다음과 같습니다.

그것이 실제로 중요하지 않은 것이 결과 일뿐입니다 (resultString 아님)


나쁘지는 않지만 반환 유형이 변경되면 변수의 이름을 바꿔야한다고 생각합니다. 현대 IDE에서는 어쨌든 한두 번의 클릭으로 완료됩니다.
Jalayn

@Jalayn 네, 그러나 유형이 이름에서 벗어난 경우 전혀 수행 할 필요가없는 변경입니다. (단순한 이름이 명확하지 않은 방법의 길이가 너무 길면 너무 길어서 리팩토링해야합니다.)
Donal Fellows

@DonalFellows 나는 당신과 완전히 동의합니다. 소스 리포지토리에서 업데이트 할 때 변경 사항이 적을수록 좋습니다.
Jalayn

반환 유형을 변경하면 변수 이름에서도 반환 유형을 변경하는 것을 잊어 버릴 수 있다는 데 동의했습니다. 지금까지는 결코 문제가되지 않았습니다. 나는 여전히 이름에 이중 의도를 표시하는 것을 좋아하지만 이미 작은 의도 코드를 보여 주면 너무 과도 할 수 있습니다. 너희들은 나를 설득했다. 지금부터 이런 식으로 변수를 호출 할 필요가 있다고 생각되면 더 이상 필요가 없을 때까지 리팩터링합니다. 감사합니다
KeesDijk

0

어느 시점에서 반환 값을 설정 한 다음 조건부를 사용하여 수정 할 수있는 모든 코드를 건너 뛰고 return즉시 ing하는 것 사이에는 큰 차이가 보이지 않으므로 직접 반환으로 이동하므로 result변수 가 없습니다 .

조건부 코드에 의해 변경되거나 변경되지 않을 수있는 중간 값이있는 경우 결과는 아니지만 아직 이름이 지정되지 않아야합니다.


0

C ++에서 일할 때 이것이 Java에 적용될 수 있다고 생각합니다.

예 :

int Width() const
{
    Requires(....);
    Requires(....);

    //calculation

    Ensures(...);
    Ensures(...);
    return Result;
}

이는 보장 블록이 메소드의 끝에 있어야하기 때문에 계약에 의해 설계되었습니다. 그러나 반환은 마지막이어야합니다. 우리는 return Result가 ensure 블록을 따르는 유일한 규칙이라는 규칙을 가지고있었습니다.


0

재귀 함수에서 테일 콜 최적화를 위해 결과를 단계별로 전달하는 것이 종종 효과적입니다. 사용자에게 매개 변수를 제공 할 필요가 없음을 알리기 위해 매개 변수 이름을 "result"로 지정하는 것이 합리적 일 수 있습니다.

def removeOccurence [A] (slice: Seq[A], original: Seq[A]) = {
  @scala.annotation.tailrec
  def remove (leftOriginal: Seq[A], result: Seq[A]) : Seq[A] =
    trimStart (slice, leftOriginal) match {
      case (h :: tail) => remove (tail, h +: result)
      case (Nil)       => result.reverse
    }
    remove (original, Nil)
}

그러나 더 자주 나는 야생에서 보았고 대부분의 경우 아이디어를 조금 더 잘 전달하는 '운반'과 '지금까지'를 사용합니다.

물론 두 번째 이유는 주제가``결과 ''라는 단어를 제안하는 경우 (예 : 산술 평가를 수행하는 경우)입니다. 수식을 구문 분석하고 변수를 값으로 바꾸고 결과를 계산할 수 있습니다.

세 번째 이유는 이미 언급되었지만 약간의 편차가 있습니다. 일을 수행하는 방법을 작성합니다 .``max ''형태를 평가한다고 가정 해 봅시다.

def max = {
  val result = somethingElseToDo
  if (foo) result else default 
}

결과``result ''를 호출하는 대신``max ''라고 부를 수 있지만 일부 언어에서는 메소드를 호출 할 때 괄호를 생략 할 수 있으므로 max는 메소드 자체에 대한 재귀 호출입니다.

일반적으로 결과가 무엇인지 알려주는 이름을 선호합니다. 그러나 GUI 이름, 문자열 표현, 숫자 및 데이터베이스에 대한 이름이 있으므로 다른 이름을 사용하면 혼동의 가능성이 높아집니다. 3 ~ 7 줄의 짧은 방법에서``결과 ''는 이름에 문제가되어서는 안됩니다.


0

오브젝트 파스칼에서 이것은 선택이 아닙니다. Result함수 코드 어딘가에 변수에 값을 할당 해야합니다.

예:

function AddIntegers( A,B: Integer): Integer;
begin
  Result := A + B; 
end; 

그래서 나에게는 꽤 자연 스럽지만 반환 값을받을 수있는 "결과"(또는 "Retorno", 언어의 예약어와 이름 충돌을 피하기 위해 포르투갈어로 철자를 쓸 때) 변수가 있습니다.

왜냐하면 C 파생 언어에서 매우 간단한 표현식이라면 결과 변수를 선언하지 않아도됩니다. 표현식을 직접 반환합니다.


0

결과의 이름을 지정하는 것뿐만 아니라 ( 'r'에 특정적임), 또한 그 결과를 어떻게 사용 했는지도 알 수 있습니다. 예를 들어, 리턴 변수를 가지려면 모든 리턴 명령문이이를 리턴해야합니다. 'return r'이 없습니다. 결국, 방법 / 함수 전체에 걸쳐 'return m * x + b;'와 같은 것을 뿌린다. "r = m * x + b; 대신 r; "을 리턴하십시오.


-1

결과는 괜찮습니다. 변수 이름이 목적에 부합하도록 처음에 코드를 이해할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.