같은 라인에 같은 유형의 여러 변수를 선언하지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/100633

문제

한 줄에 변수를 선언하는 것이 왜 나쁜 습관입니까?

예를 들어

private String var1, var2, var3

대신에:

private String var1;
private String var2;
private String var3;
도움이 되었습니까?

해결책

여러 가지 이유가 있다고 생각합니다. 그러나 한 줄이 여러 가지 작업을 수행하기 때문에 첫 번째 이유는 가독성이 낮고 실패할 가능성이 더 높다는 점으로 요약됩니다.

그리고 이 모든 것은 실질적인 이득이 아니며 두 줄의 절약된 공간을 찾는 것이 실제 이득이라고 말하지 마십시오.

그것은 당신이 가질 때 일어나는 일과 비슷합니다.

if ((foo = some_function()) == 0) {
    //do something
}

물론 이 예는 당신의 예보다 훨씬 더 나쁩니다.

다른 팁

제 생각에는 각 변수를 별도의 줄에 두는 주요 목표는 버전 관리 도구의 작업을 용이하게 하는 것입니다.

여러 변수가 같은 줄에 있으면 다른 개발자가 관련 없는 수정으로 인해 충돌이 발생할 위험이 있습니다.

C++에서:

int * i, j;

i는 int * 유형이고, j는 int 유형입니다.그 구별은 너무 쉽게 놓치게 됩니다.

한 줄로 작성하는 것 외에도 나중에 주석을 추가하기가 더 쉽습니다.

C/C++에서는 포인터 유형을 나타내는 데 사용되는 *가 바로 다음 식별자에만 적용된다는 문제도 있습니다.따라서 경험이 부족한 개발자가 흔히 저지르는 실수는 다음과 같습니다.

int* var1, var2, var3;

세 변수 모두 'int 포인터' 유형일 것으로 예상하는 반면, 컴파일러에서는 다음과 같이 읽습니다.

int* var1;
int var2;
int var3;

var1만 포인터로 만듭니다.

별도의 줄을 사용하면 변수의 사용을 설명하는 주석을 각 줄에 추가할 수 있습니다(이름이 명확하지 않은 경우).

일부 언어에서는 예제의 var2 및 var3이 ~ 아니다 문자열이면 변형(유형이 지정되지 않음)이 됩니다.

그게 왜 나쁜 습관인가요?코드를 여전히 읽을 수 있는 한 그렇지 않다고 생각합니다.

//not much use
int i, j, k;

//better
int counter, 
    childCounter, 
    percentComplete;

솔직히 말해서 나는 그것에 반대하지 않습니다.나는 유사한 변수를 같은 줄에 그룹화하는 것이 완벽하게 가능하다고 생각합니다.

플로트 fMin, fMax;

그러나 변수가 관련이 없을 때는 명확하게 처리합니다.

int iBalance, iColor;

관련성.

두 변수가 문자열 유형이라고 해서 서로 밀접하게 관련되어 있다는 의미는 아닙니다.

두 개 이상의 변수가 변수 유형이 아닌 함수별로 밀접하게 관련되어 있는 경우 함께 선언할 수 있습니다.즉.두 변수가 실제로 함께 배치되어 있으면 프로그램 독자가 두 변수를 함께 볼 수 있는 경우에만 가능합니다.

내 이유는 다음과 같습니다.

  • 가독성, 각 줄에 하나만 있다는 것을 알면 쉽게 찾을 수 있습니다.
  • 버전 제어, 라인 내 변경 감소, 단일 라인 추가, 변경 또는 삭제 증가, 한 지점에서 다른 지점으로 더 쉽게 병합

다음과 같은 경우는 어떻습니까?

public static final int NORTH = 0,
                        EAST = 1,
                        SOUTH = 2,
                        WEST = 3;

그것도 나쁜 습관으로 간주됩니까?나는 이전에 언급한 몇 가지 요점을 반박하므로 괜찮다고 생각합니다.

  • 그들은 모두 확실히 같은 유형일 것입니다(정적으로 유형이 지정된 Java 세계에서).
  • 댓글은 각각 추가 가능
  • 하나의 유형을 변경해야 한다면 아마도 모두에 대해 변경해야 하며, 네 가지 모두를 한 번의 변경으로 수행할 수 있습니다.

따라서 (비록 냄새나는 코드이기는 하지만) 예에서 그렇게 하지 않을 이유가 있습니까?

edg에 동의하며, 각 변수를 별도의 줄에 두는 것이 더 읽기 쉽고 유지 관리가 쉽기 때문입니다.유형, 범위 및 기타 수정자를 즉시 ​​볼 수 있으며 수정자를 변경하면 원하는 변수에만 적용되므로 오류가 발생하지 않습니다.

  1. 버전 관리 도구를 사용할 때 더 명확해집니다(Michel이 다룹니다).
  2. 가장 간단한 오버플로/언더플로 또는 컴파일 오류가 발생하여 눈으로 명백한 오류를 지적하지 못했을 때 더 쉽게 읽을 수 있습니다.
  3. 반대쪽을 방어하기 위해(예:다중 변수 한 줄 선언) 장점이 적습니다("코드 텍스트 수직 가시성"이 싱글톤임).

감속 시 변수를 초기화할 수 있고 초기화하려는 경우에는 주로 나쁜 습관입니다.이것이 그다지 나쁘지 않은 예는 다음과 같습니다.

string a,b;
if (Foo())
{
  a = "Something";
  b = "Something else";
}
else
{
  a = "Some other thing";
  b = "Out of examples";
}

일반적으로 다른 사람들이 논의한 버전 관리 및 주석 작성 이유 때문에 그렇습니다. 모든 경우의 95%에 적용하겠습니다.그러나 이것이 의미가 있는 상황이 있습니다. 예를 들어 그래픽을 코딩하고 텍스처 좌표를 나타내기 위해 두 개의 변수를 원하는 경우(항상 관례에 따라 s 및 t로 참조됨) 다음과 같이 선언합니다.

int s, t;// 텍스처 좌표

IMHO는 코드를 단축하고 이 두 변수가 함께 속한다는 것을 명시함으로써 코드 가독성을 향상시킵니다(물론 일부는 이 경우 단일 포인트 클래스 변수를 사용해야 한다고 주장합니다).

이 질문을 시도하는 동안 https://www.interviewbit.com/problems/remove-element-from-array/

방법 1은 이 코드에 대해 메모리 제한 초과를 제공합니다.

유형 1:

int i,j;

유형 2:

int i;
int j;

유형 1:메모리 제한이 초과되었습니다.

int removeElement  (int* A, int n1, int B) 
{
    int k=0, i;
    for(i=0;i<n1;i++)
        if(A[i]!=B)
        {
            A[k]=A[i];
            k++;
        }    
    return k;
}

유형 2는 완벽하게 작동하는 반면

int removeElement  (int* A, int n1, int B) 
{
    int k=0;
    int i;
    for(i=0;i<n1;i++)
        if(A[i]!=B)
        {
            A[k]=A[i];
            k++;
        }    
    return k;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top