같은 라인에 같은 유형의 여러 변수를 선언하지 않는 이유는 무엇입니까?
-
01-07-2019 - |
문제
한 줄에 변수를 선언하는 것이 왜 나쁜 습관입니까?
예를 들어
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에 동의하며, 각 변수를 별도의 줄에 두는 것이 더 읽기 쉽고 유지 관리가 쉽기 때문입니다.유형, 범위 및 기타 수정자를 즉시 볼 수 있으며 수정자를 변경하면 원하는 변수에만 적용되므로 오류가 발생하지 않습니다.
- 버전 관리 도구를 사용할 때 더 명확해집니다(Michel이 다룹니다).
- 가장 간단한 오버플로/언더플로 또는 컴파일 오류가 발생하여 눈으로 명백한 오류를 지적하지 못했을 때 더 쉽게 읽을 수 있습니다.
- 반대쪽을 방어하기 위해(예:다중 변수 한 줄 선언) 장점이 적습니다("코드 텍스트 수직 가시성"이 싱글톤임).
감속 시 변수를 초기화할 수 있고 초기화하려는 경우에는 주로 나쁜 습관입니다.이것이 그다지 나쁘지 않은 예는 다음과 같습니다.
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;
}